【问题标题】:pandas apply upper() works on each of two string columns separately, but not togetherpandas apply upper() 分别在两个字符串列中的每一个上工作,但不能一起工作
【发布时间】:2018-05-31 19:27:37
【问题描述】:

我有一个简单的数据框:

    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())

导致“AttributeError: ("'Series' object has no attribute 'upper'", 'occurred at index a')”。

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

【问题讨论】:

  • 你看看使用pd.DataFrame.applypd.Series.apply的区别。

标签: python pandas lambda


【解决方案1】:

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

这里我们使用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 并自行传递每个值。因此,我们可以简单地在每个值上直接调用字符串函数upper。

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

【讨论】:

  • 是的,生活和学习!我现在不仅知道如何解决它,还知道为什么一开始就有问题。谢谢。
【解决方案2】:

使用applymap 以便:

将函数应用于旨在按元素进行操作的 DataFrame,即像为 DataFrame 中的每个系列执行 map(func, series)

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

       a         b
0  HORSE       CAT
1    DOG  ELEPHANT

【讨论】:

  • 很高兴为您提供帮助,我建议您查看 Scott 对您最初尝试失败的原因的解释,它涵盖了所有好东西。
猜你喜欢
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 2020-06-30
  • 2012-12-04
  • 1970-01-01
相关资源
最近更新 更多