我有一个返回dict对象的函数,我想利用pandas/numpy在数据帧的每一行中为该函数执行逐列操作/矢量化的能力。函数的输入在数据帧中指定,我希望函数的输出成为现有数据帧上的新列。下面是一个例子。
def func(a, b, c):
return {
"a_calc": a * 2,
"b_calc": b * 3,
"c_calc": c * 4
}
df = pd.DataFrame([{"a":1, "b":2, "c": 3}, {"a": 4, "b": 5, "c": 6}])
a b c
0 1 2 3
1 4 5 6
期望输出:
a b c a_calc b_calc c_calc
0 1 2 3 2 6 12
1 4 5 6 8 15 24
我正在阅读这个答案,它大部分都是这样的,但当函数返回一个dict对象,并将所需的列名作为dict中的键时,我不太明白该怎么做。
让我们使用一些数据帧解包:
df.join(pd.DataFrame(func(**df)))
输出:
a b c a_calc b_calc c_calc
0 1 2 3 2 6 12
1 4 5 6 8 15 24
或者真的很可爱:
df.assign(**func(**df))
如果您不能修改您的函数,您可以执行:
df.join(pd.DataFrame(func(df['a'], df['b'],df['c']), index=df.index))
输出:
a b c a_calc b_calc c_calc
0 1 2 3 2 6 12
1 4 5 6 8 15 24
注意我们利用了func
可以接受串行输入并并行工作的事实。在一般情况下,您需要一个for
循环:
pd.DataFrame([func(x['a'], x['b'], x['c']) for _, x in df.iterrows()],
index=df.index)