使用字典理解在 pd.assign 中分配多列

问题描述 投票:0回答:2

我试图获取列对之间的差异,并使用 pd.assign 和字典理解创建具有列名称和“diff”的新列

示例 df 如下所示:

df
    A    B    C    D    E    F
0   2    1    3    5    2    2
1   3    4    5    6    3    5

我对哪些列采取哪些差异的映射如下所示:

column_mapping = {
'A': 'B',
'C': 'D',
'E': 'F'}

我尝试为这样的分配方法创建一个 kwargs 字典理解:

kwargs = {key+'_diff': lambda df: eval(f"(df['{key}'] - df['{value}']) / df['{key}']") for key, value in zip(column_mapping.keys(), column_mapping.values())}

我也尝试过

kwargs = {key+'_diff': lambda df: (df[key] - df[value]) / df[key]) for key, value in zip(column_mapping.keys(), column_mapping.values())}

这给出了我传递给 .assign 的 lambda 函数的映射

df.assign(**kwargs)

这确实有效,但是会生成具有不同名称和完全相同数字的所有差异列,这是 E 列和 F 列的差异:

示例 df 如下所示:

df
    A    B    C    D    E    F    a_diff   c_diff  e_diff
0   2    1    3    5    2    2    0        0       0 
1   3    4    5    6    3    5    -2       -2      -2

我认为这应该是可能的,并且感觉我很接近,但它相信它正在迭代所有 lambda 函数而不是一个。请有人帮忙指出我在这里做什么。

如果有任何不清楚的地方请告诉我。

谢谢

python pandas lambda assign
2个回答
0
投票

您可以使用 for 循环并在循环中分配新列:

for key, value in column_mapping.items():
    df[key+'_diff'] = (df[key] - df[value]) / df[key]

0
投票

让我们修复您的

assign
方法

df.assign(**{f'{k}_diff': df[k].sub(df[v]).div(df[k]) for k, v in column_mapping.items()})

assign
的替代方法:

k, v =  map(list, zip(*column_mapping.items()))
df.assign(**((df[k] - df[v].values) / df[k]).add_suffix('_diff'))

   A  B  C  D  E  F    A_diff    C_diff    E_diff
0  2  1  3  5  2  2  0.500000 -0.666667  0.000000
1  3  4  5  6  3  5 -0.333333 -0.200000 -0.666667
© www.soinside.com 2019 - 2024. All rights reserved.