我试图获取列对之间的差异,并使用 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 函数而不是一个。请有人帮忙指出我在这里做什么。
如果有任何不清楚的地方请告诉我。
谢谢
您可以使用 for 循环并在循环中分配新列:
for key, value in column_mapping.items():
df[key+'_diff'] = (df[key] - df[value]) / df[key]
让我们修复您的
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