>我有一个简单的数据帧,大致如下:
a b
0 horse cat
1 dog elephant
运行:
df.loc[:,'a'].apply(lambda x: x.upper())
或
df.loc[:,'b'].apply(lambda x: x.upper())
将相应列中的动物大写。但是,跑步
df.loc[:,'a':'b'].apply(lambda x: x.upper())
或
df.loc[:,['a','b']].apply(lambda x: x.upper())
结果为"属性错误:("'系列'对象没有属性'上层','发生在索引 a'("。
显然,我想知道如何修复它(即能够一次将两列大写(。但我也想知道列如何单独具有属性"upper",但在将 lambda 作为多个列的一部分应用于它时会丢失它。
使用 str accessor:
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'>
在这里我们使用pd.DataFrame.apply
.
在这种情况下,熊猫系列被传递给函数 f,因此我们可以使用 .str 访问器来调用字符串函数 upper。
现在,让我们看一下第一种情况:
def f(x):
print(type(x))
print(type(x[0]))
df.loc[:,'a'].apply(f)
输出:
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
在这里,使用的是pd.Series.apply
并传递每个值本身。 因此,我们可以简单地直接在每个值上调用字符串函数。
而且,您还可以使用@chrisz解决方案中显示的pd.DataFrame.applymap
将数据帧的每个单元格值传递给函数。
使用applymap
以便:
将函数应用于旨在按元素操作的数据帧,即像对数据帧中的每个系列执行map(func,series(一样
df[['a', 'b']].applymap(lambda x: x.upper())
a b
0 HORSE CAT
1 DOG ELEPHANT