我有一个函数,它需要几个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
正在转换,因为否则它将逐行发送,而不是逐列发送。