注意:为了简单起见,我使用了一个玩具示例,因为复制/粘贴数据帧在堆栈溢出中很困难(请告诉我是否有一种简单的方法可以做到这一点)
有没有一种方法可以将一个数据帧中的值合并到另一个数据帧中,而不获取_X,_Y列?我希望一列上的值替换另一列上的所有零值
df1:
Name Nonprofit Business Education
X 1 1 0
Y 0 1 0 <- Y and Z have zero values for Nonprofit and Educ
Z 0 0 0
Y 0 1 0
df2:
Name Nonprofit Education
Y 1 1 <- this df has the correct values.
Z 1 1
pd.merge(df1, df2, on='Name', how='outer')
Name Nonprofit_X Business Education_X Nonprofit_Y Education_Y
Y 1 1 1 1 1
Y 1 1 1 1 1
X 1 1 0 nan nan
Z 1 1 1 1 1
在上一篇文章中,我尝试了先组合_和dropna(),但这两种方法都不行
我想用df2中的值替换df1中的零。 此外,我希望具有相同名称的所有行都根据df2进行更改
Name Nonprofit Business Education
Y 1 1 1
Y 1 1 1
X 1 1 0
Z 1 0 1
(需要澄清:name=Z的“业务”列中的值应为0。)
我现有的解决方案执行以下操作: 我基于df2中存在的名称创建子集,然后用正确的值替换这些值。不过,我想用一种不太老套的方式来做这件事
pubunis_df = df2
sdf = df1
regex = str_to_regex(', '.join(pubunis_df.ORGS))
pubunis = searchnamesre(sdf, 'ORGS', regex)
sdf.ix[pubunis.index, ['Education', 'Public']] = 1
searchnamesre(sdf, 'ORGS', regex)
使用来自^{} 的布尔掩码过滤df并从rhs df分配所需的行值:
在[27]中: 这是正确的
[4行x 4列]
只有当df1中的所有行都存在于df中时,上述操作才起作用。换句话说,df应该是df1的超集
如果您在df1中有一些与df不匹配的行,您应该遵循以下步骤
换句话说,df不是df1的超集:
注意:在最新版本的《熊猫》中,上述两个答案不再适用:
KSD的回答将引发错误:
EdChum的回答会给我们错误的结果:
好的,只有当列“Name”中的值是唯一的并且在两个数据帧中都排序时,它才能安全地工作
以下是我的答案:
方式1:
方式2:
More guide about update.。需要设置索引的两个数据帧的列名在“更新”之前不必相同。你可以试试“Name1”和“Name2”。此外,即使df2中的其他不必要行不会更新df1,它也可以工作。换句话说,df2不需要是df1的超集
例如:
结果:
相关问题 更多 >
编程相关推荐