我有两个熊猫数据框,我想将它们合并在一起,但是不像在示例中看到的那样。我有一组“旧”数据和一组“新”数据,它们对于两个形状相同且具有相同列名的数据框。我进行了一些分析,确定需要创建第三个数据集,其中一些来自“旧”数据列,一些来自“新”数据列。例如,假设我有以下两个数据集:
df_old = pd.DataFrame(np.zeros([5,5]),columns=list('ABCDE'))
df_new = pd.DataFrame(np.ones([5,5]),columns=list('ABCDE'))
简单来说就是:
A B C D E
0 0.0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0 0.0
4 0.0 0.0 0.0 0.0 0.0
和
A B C D E
0 1.0 1.0 1.0 1.0 1.0
1 1.0 1.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0 1.0
3 1.0 1.0 1.0 1.0 1.0
4 1.0 1.0 1.0 1.0 1.0
我进行了一些分析,发现我想替换列B
和D
。我可以像这样循环执行:
replace = dict(A=False,B=True,C=False,D=True,E=False)
df = pd.DataFrame({})
for k,v in sorted(replace.items()):
df[k] = df_new[k] if v else df_old[k]
这给了我我想要的数据:
A B C D E
0 0.0 1.0 0.0 1.0 0.0
1 0.0 1.0 0.0 1.0 0.0
2 0.0 1.0 0.0 1.0 0.0
3 0.0 1.0 0.0 1.0 0.0
4 0.0 1.0 0.0 1.0 0.0
但是,老实说,这似乎有些笨拙,而且我想有一种更好的方法可以使用熊猫来做到这一点。另外,我想保留列的顺序,而不是像本示例数据集那样按字母顺序排列,因此对字典进行排序可能不是走的路,尽管我可以从数据集中提取列名称,如果需要。
是否有更好的方法使用某些Pandas合并功能来做到这一点?
一个真正的基本方法就是过滤布尔值字典,然后直接分配。
to_rep = [k for k in replace if replace[k]]
df_old[to_rep] = df_new[to_rep]
如果您想保留旧的DataFrame,则可以使用 assign()
df_old.assign(**{k: df_new[k] for k in replace if replace[k]})
正如尼克(Nickil)提到的那样,assign()
显然在我们传递命令时并没有保留论据顺序。但是,可以预见,它将按字母顺序将分配的列插入DataFrame的末尾。
演示版
>>> df_old.assign(**{k: df_new[k] for k in replace if replace[k]})
A B C D E
0 0.0 1.0 0.0 1.0 0.0
1 0.0 1.0 0.0 1.0 0.0
2 0.0 1.0 0.0 1.0 0.0
3 0.0 1.0 0.0 1.0 0.0
4 0.0 1.0 0.0 1.0 0.0
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句