如何解决如果它们在循环中具有相同的结尾,请减去数据帧中的两列
如果我的数据看起来像这样
Index Country ted_Val1 sam_Val1 ... ted_Val10 sam_Val10
1 Australia 1 3 ... 20 5
2 Bambua 12 33 ... 15 56
3 Tambua 14 34 ... 10 58
df = pd.DataFrame([["Australia",1,3,20,5],["Bambua",12,33,15,56],["Tambua",14,34,10,58]
],columns=["Country","ted_Val1","sam_Val1","ted_Val10","sam_Val10"]
)
我想使用列表从所有“ ted_”值中减去所有“ val_”列,并创建一个以“ dif_”开头的新列,如下所示:
Index Country ted_Val1 sam_Val1 diff_Val1 ... ted_Val10 sam_Val10 diff_val10
1 Australia 1 3 -2 ... 20 5 -15
2 Bambua 12 33 12 ... 15 56 -41
3 Tambua 14 34 14... 10 58 -48
到目前为止,我已经得到:
calc_vars = ['ted_Val1','sam_Val1','ted_Val10','sam_Val10']
for i in calc_vars:
df_diff['dif_' + str(i)] = df.['ted_' + str(i)] - df.['sam_' + str(i)]
但是我遇到了错误,不确定从何处去。作为警告,这是伪数据,名称中可能有多个下划线
解决方法
IIUC,您可以使用filter
选择要减去的列(假设您的列按照样本的方式正确排序):
print (pd.concat([df,pd.DataFrame(df.filter(like="ted").to_numpy()-df.filter(like="sam").to_numpy(),columns=["diff"+i.split("_")[-1] for i in df.columns if "ted_Val" in i])],1))
Country ted_Val1 sam_Val1 ted_Val10 sam_Val10 diff1 diff10
0 Australia 1 3 20 5 -2 15
1 Bambua 12 33 15 56 -21 -41
2 Tambua 14 34 10 58 -20 -48
,
尝试一下
calc_vars = ['ted_Val1','sam_Val1','ted_Val10','sam_Val10']
# extract even & odd values from calc_vars
# ['ted_Val1','ted_Val10'],['sam_Val1','sam_Val10']
for ted,sam in zip(calc_vars[::2],calc_vars[1::2]):
df['diff_' + ted.split("_")[-1]] = df[ted] - df[sam]
编辑:如果列未排序,
ted_cols = sorted(df.filter(regex="ted_Val\d+"),key=lambda x : x.split("_")[-1])
sam_cols = sorted(df.filter(regex="sam_Val\d+"),key=lambda x : x.split("_")[-1])
for ted,sam in zip(ted_cols,sam_cols):
df['diff_' + ted.split("_")[-1]] = df[ted] - df[sam]
Country ted_Val1 sam_Val1 ted_Val10 sam_Val10 diff_Val1 diff_Val10
0 Australia 1 3 20 5 -2 15
1 Bambua 12 33 15 56 -21 -41
2 Tambua 14 34 10 58 -20 -48
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。