如何在函数调用中将DataFrame解包到单独的系列中



我有一个函数,它需要几个pandas系列作为参数:

def func(s1, s2, s3): 
print(s1, s2, s3)

以及一个具有列"a"到"Z"的DataFrame df。

我想这样调用函数:

func(*df[['A', 'D', 'R']])

但是,打开DataFrame的包装似乎只生成列名,而不是数据。我知道使用双星我可以在字典中得到三个想要的序列,但名称必须匹配,所以这在这里不起作用。

我想做的事情有简洁的语法吗?

额外的问题:python社区是否将*和**称为splat和double splat?这是一个很难搜索的话题!

map下使用df.get,我们可以将子集解压缩为单个系列:

cols = ['A','D','R']
func(*map(df.get,cols))

样本运行:

df = pd.DataFrame({"A":[1,2],"B":[3,4],"C":[4,5]})
def func(s1, s2, s3): 
print(s1, s2, s3)
cols = ['A','B','C']
func(*map(df.get,cols))
0    1
1    2
Name: A, dtype: int64 0    3
1    4
Name: B, dtype: int64 0    4
1    5
Name: C, dtype: int64

我认为这里最简洁的是

func(*[df[c] for c in "ADR"])

如果你不想要索引,你可以做:

func(*df[['A', 'D', 'R']].T.values)

T正在转换,因为否则它将逐行发送,而不是逐列发送。

最新更新