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'>