从函数返回dict创建多个panda列



我有一个返回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)

最新更新