Python pandas apply upper()分别作用于两个字符串列中的每一列,但不能同时作用

Python pandas apply upper()分别作用于两个字符串列中的每一列,但不能同时作用,python,pandas,lambda,Python,Pandas,Lambda,我有一个简单的数据框架,大致如下: a b 0 horse cat 1 dog elephant 运行: df.loc[:,'a'].apply(lambda x: x.upper()) 或 将相应列中的动物大写。然而,运行 df.loc[:,'a':'b'].apply(lambda x: x.upper()) 或 结果为“AttributeError:(“'Series'对象没有属性'upper','发生在索引a')” 显然,我想知道如何修复它(即,

我有一个简单的数据框架,大致如下:

    a       b
 0  horse  cat
 1  dog    elephant
运行:

df.loc[:,'a'].apply(lambda x: x.upper())

将相应列中的动物大写。然而,运行

df.loc[:,'a':'b'].apply(lambda x: x.upper())

结果为“AttributeError:(“'Series'对象没有属性'upper','发生在索引a')”

显然,我想知道如何修复它(即,能够同时将两列大写)。但我也想知道一个列如何单独具有“upper”属性,但当lambda作为多个列的一部分应用于该列时,它会丢失该属性。

使用该属性可以:

将一个函数应用于一个数据帧,该数据帧旨在进行元素操作,例如,为数据帧中的每个系列执行映射(func,series)

使用str访问器:

df.loc[:,'a':'b'].apply(lambda x: x.str.upper())
输出:

       a         b
0  HORSE       CAT
1    DOG  ELEPHANT
这是怎么回事? 好的,让我们做一点调试:

def f(x):
    print(type(x))
    print(type(x[0]))

df.loc[:,'a':'b'].apply(f)
输出:

<class 'pandas.core.series.Series'>
<class 'str'>
<class 'pandas.core.series.Series'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
输出:

<class 'pandas.core.series.Series'>
<class 'str'>
<class 'pandas.core.series.Series'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>

这里,我们使用的是
pd.Series.apply
并传递每个值本身。因此,我们可以直接在每个值上调用字符串函数upper


而且,您还可以像在他的解决方案中一样使用
pd.DataFrame.applymap
将数据帧的每个单元格值传递给函数。

您正在查看使用
pd.DataFrame.apply
pd.Series.apply
的区别。很高兴为您提供帮助,我建议你看看斯科特对你最初尝试失败原因的解释,它涵盖了所有好东西。是的,活到老学到老!我现在不仅知道如何修复它,还知道为什么一开始就有问题。谢谢
def f(x):
    print(type(x))
    print(type(x[0]))

df.loc[:,'a'].apply(f)
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>