熊猫分别应用 upper() 对两个字符串列中的每一个工作,但不能一起工作



>我有一个简单的数据帧,大致如下:

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

最新更新