使用 Pandas 的 .apply() 函数创建新列,即使 DataFrame 为空

3

我想使用Pandas的apply方法来创建一个新列,即使DataFrame是空的,我也希望这种功能具有失败保护性。以下是一个最小化的示例,能够按预期工作:

df      = pd.DataFrame(np.array([[1,2],[3,4]]), columns=['a','b']) # two columns
add     = lambda x: x['a'] + x['b'] # add column a and b # add two values
df['c'] = df.apply( add, axis=1 ) # creates new column c, as anticipated

然而,当df为空时会出现问题。考虑以下示例,其中DataFrame现在为空,但是其他方面相等:

df      = pd.DataFrame( columns=['a','b']) # two columns, but no values
df['c'] = df.apply( add, axis=1 ) # raises an error!

如何安全地执行这个最后一列,以便将列“c”附加到DataFrame中,即使df为空也是如此?

有趣的是,这样做可以正常工作。

df.apply( add, axis=1 )

但无法附加为列“c”。


这个回答解决了你的问题吗?在空的pandas DataFrame上调用apply() - Fabich
2个回答

0
如果您想基于列ab的总和创建一个新列c,那么您只需要执行以下操作:
df['c'] = df['a'] + df['b']  # creates new column c, as anticipated :)

这样,您就不需要将lambda表达式分配给函数add(不建议将lambda表达式分配给函数)。

import numpy as np
import pandas as pd

df = pd.DataFrame(np.array([[1, 2], [3, 4]]), columns=['a', 'b'])  # two columns
print(df)
   a  b
0  1  2
1  3  4

df['c'] = df['a'] + df['b']  # creates new column c, as anticipated
print(df)
   a  b  c
0  1  2  3
1  3  4  7

df = pd.DataFrame(columns=['a', 'b'])  # two columns, but no values
df['c'] = df['a'] + df['b']  # creates new column c, as anticipated
print(df)
Empty DataFrame
Columns: [a, b, c]
Index: []

即使数据框为空,上述方法也能正常工作。


2
当然,对于我的简单示例来说,这确实是一个解决方案。但是我的问题更普遍适用,其中“add”是一个依赖于其他组件且无法像“add”示例中那样序列化的复杂函数。 - user56643

0

如果一个轴(行或列)为空,则应用函数将返回空结果

您定义的lambda函数返回pandas.Series。为了处理空的pandas.DataFrame,需要更明确地指定apply方法的结果类型并使用reduce模式。

'reduce':如果可能,返回Series而不是扩展类似列表的结果。这与“expand”的相反。

这将起作用:

df = pd.DataFrame(columns=['a','b'])
df['c'] = df.apply(add, axis=1, result_type='reduce')

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