繁体   English   中英

大熊猫:根据布尔值列表/字典替换数据框列

[英]Pandas: Replace dataframe columns based on Boolean list/dict

我有两个熊猫数据框,我想将它们合并在一起,但是不像在示例中看到的那样。 我有一组“旧”数据和一组“新”数据,它们对于两个形状相同且具有相同列名的数据框。 我进行了一些分析,确定需要创建第三个数据集,其中一些来自“旧”数据列,一些来自“新”数据列。 例如,假设我有以下两个数据集:

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

我进行了一些分析,发现我想替换列BD 我可以像这样循环执行:

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

但是,老实说,这似乎有些笨拙,而且我想有一种更好的方法可以使用熊猫来做到这一点。 另外,我想保留列的顺序,该列可能不像本示例数据集那样按字母顺序排列,因此对字典进行排序可能不是走的路,尽管如果可能的话,我可能会从数据集中提取列名需要。

是否有更好的方法使用某些熊猫合并功能来做到这一点?

一个真正的基本方法只是过滤布尔值字典,然后直接分配。

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

只需分配所需的新列即可:

df_old['B'] = df_new['B']
df_old['D'] = df_new['D']

或作为一行:

df_changes = df_old.copy()
df_changes[['B', 'D']] = df_new[['B', 'D']]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM