在Pandas数据帧中逐个元素应用条件

7

我正在学习Python,并尝试理解Pandas数据框中apply()方法的工作原理。

作为练习,我想使用一行代码仅对Pandas数据框中的字符串元素应用str.upper()方法。

我考虑将lambda条件表达式与apply相结合,但问题在于当apply调用Pandas数据框时,数据框返回一个Series给apply,然后再将其传递给函数。我想知道如何更深入地调用Pandas数据框的元素并对其进行处理。

当apply()调用DataFrame(Series)的列时,这是我实现意图的方式:

df= pd.DataFrame([[1, 'a'],['b',2]], columns = ['A', 'B'] )
df['A'].apply(lambda x: str.upper(x) if type(x) is str else x)

但是我怎样才能用一行代码对整个数据框进行操作呢?

我正在寻找一种解决方案,可以处理同时包含数字和字符串的列,并保留数字不变。


你可以使用 df.applymap(),但是它非常慢 - 所以请小心。 - MaxU - stand with Ukraine
在你学习的时候还有一件事需要注意:如果你正在检查某个东西是否为字符串并将其转换为大写字母,可以使用以下代码:lambda x: x.upper() if isinstance(x, basestring) else x - the_constant
@MaxU:您是否愿意发布一个答案,展示如何使用applymap()来解决具体问题,例如数据框? - gk7
@gk7,piRSquared提供了一个很好的例子;-) - MaxU - stand with Ukraine
1个回答

7

你的简洁表述

df.applymap(lambda x: x.upper() if isinstance(x, str) else x)

   A  B
0  1  A
1  B  2

2
如果这是在 Python 3 之前,OP 应该在 isinstance() 中使用 basestring 而不是 str - the_constant
1
@Vincenzzzochi,basestring在Python 3中无法使用,因此需要使用siximport six; df.applymap(lambda x: x.upper() if isinstance(x, six.string_types) else x) - 这应该适用于Python 2.x和Python 3.x。 - MaxU - stand with Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接