对 Pandas 数据框逐元素应用条件

Posted

技术标签:

【中文标题】对 Pandas 数据框逐元素应用条件【英文标题】:Apply with a condition on a Pandas dataframe elementwise 【发布时间】:2017-06-06 16:59:52 【问题描述】:

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

作为一个练习,我想使用一行代码将 str.upper() 方法应用于 Pandas 数据框的元素,前提是这些元素是字符串。

我想将 lambda 条件表达式与 apply 结合使用,但问题是当 apply 调用 Pandas 数据框时,数据框——如果我理解得很好——返回一个系列来应用,然后将其传递给函数。我想知道如何才能更深入地了解并调用 Pandas 数据框元素上的函数。

当 apply() 调用 DataFrame 的一列(一个系列)时,这就是我想要做的事情:

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(),但它非常慢 - 所以要小心 在学习时要注意的另一件事:如果您正在检查某个内容是否为字符串并将其转换为大写:lambda x: x.upper() if isinstance(x, basestring) else x @MaxU :您想发布一个答案,展示如何使用 applymap() 来解决示例数据框的特定问题吗? @gk7,piRSquared 有一个很好的例子 ;-) 【参考方案1】:

你的单线

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

   A  B
0  1  A
1  B  2

【讨论】:

如果这是在 Python 3 之前,OP 应该在 isinstance() 中使用 basestring 而不是 str @Vincenzzzochi, basestring 在 Python 3 中不起作用,因此需要使用 six: import six; df.applymap(lambda x: x.upper() if isinstance(x, six.string_types) else x) - 这应该适用于 Python 2.x 和 Python 3.x

以上是关于对 Pandas 数据框逐元素应用条件的主要内容,如果未能解决你的问题,请参考以下文章

Numpy isnan() 在浮点数组上失败(来自 pandas 数据框应用)

python--pandas分组聚合

pandas基于组合条件对数据列进行判断并将满足条件的数据行全部更新为某一个固定值(updating rows based on column values)

pandas 筛选负数并替换

Pandas —— 数据分组

按列表列中的元素对 Pandas 数据框进行分组