pandas 如果数据帧为空,应用函数 (UDF) 无法 return 多个值
pandas apply function (UDF) fails to return multiple values in case the dataframe is empty
我希望能够 return 来自 pandas UDF(应用函数)的多个列。这很好用,只要数据框不为空!
如果它是空的,它会失败:not enough values to unpack (expected 3, got 0)
。这是否被视为 pandas 中的错误?还是应该强制用户在执行函数之前手动检查过滤数据帧的长度?或者有没有更好的方法避免 运行 陷入这个问题?
import pandas as pd
df = pd.DataFrame({'foo':[1,2,3], 'bar':[4,5,6]})
def my_function(x):
#print(x)
# some computation
# returns multiple values (tuple)
# simplified here
return 1,1,1
df = df[df.foo > 10]
df['r1'], df['r2'], df['r3'] = zip(*df.apply(my_function, axis=1))
df
一种解决方案是结合使用 pd.concat
和 result_type='expand'
。
cols = {0: 'r1', 1: 'r2', 2: 'r3'}
df = pd.concat([df, df.apply(my_function, axis=1, result_type='expand')], axis=1).rename(columns=cols)
之后您必须重命名列。此外,生成的空数据框重复前两列:
输出:
foo bar foo bar
对比
foo bar
两个数据框都是空的,所以您可能不感兴趣。
我认为检查 pandas 中的空数据框是个好习惯。所以,评论中的Siddhants解决方案就好了。
我希望能够 return 来自 pandas UDF(应用函数)的多个列。这很好用,只要数据框不为空!
如果它是空的,它会失败:not enough values to unpack (expected 3, got 0)
。这是否被视为 pandas 中的错误?还是应该强制用户在执行函数之前手动检查过滤数据帧的长度?或者有没有更好的方法避免 运行 陷入这个问题?
import pandas as pd
df = pd.DataFrame({'foo':[1,2,3], 'bar':[4,5,6]})
def my_function(x):
#print(x)
# some computation
# returns multiple values (tuple)
# simplified here
return 1,1,1
df = df[df.foo > 10]
df['r1'], df['r2'], df['r3'] = zip(*df.apply(my_function, axis=1))
df
一种解决方案是结合使用 pd.concat
和 result_type='expand'
。
cols = {0: 'r1', 1: 'r2', 2: 'r3'}
df = pd.concat([df, df.apply(my_function, axis=1, result_type='expand')], axis=1).rename(columns=cols)
之后您必须重命名列。此外,生成的空数据框重复前两列:
输出:
foo bar foo bar
对比
foo bar
两个数据框都是空的,所以您可能不感兴趣。
我认为检查 pandas 中的空数据框是个好习惯。所以,评论中的Siddhants解决方案就好了。