注意:为了简单起见,我使用了一个玩具示例,因为在堆栈溢出中复制/粘贴数据帧是很困难的(如果有简单的方法,请告诉我)。
有没有一种方法可以将一个数据帧中的值合并到另一个数据帧中,而不必获取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
在之前的一篇文章中,我尝试了combine_First和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的'Business'列中的值应该为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)
在[27]中: 这是正确的。
[4行x 4列]
只有当df1中的所有行都存在于df中时,上述操作才有效。换句话说,df应该是df1的超集
如果在df1中有一些与df不匹配的行,则应遵循以下步骤
换句话说,df不是df1的超集:
注意:在最新版本的熊猫中,以上两个答案都不再有效:
KSD的答案将引发错误:
EdChum的回答会给我们一个错误的结果:
好吧,只有当列“Name”中的值是唯一的并且在两个数据帧中都排序时,它才能安全地工作。
我的答案是:
方式1:
方式2:
More guide about update.。需要设置索引的两个数据帧的列名在“update”之前不必相同。你可以试试“Name1”和“Name2”。而且,即使df2中有其他不必要的行,它也可以工作,这不会更新df1。换句话说,df2不需要是df1的超集。
示例:
结果:
使用^{} 中的布尔掩码筛选df并从rhs df中分配所需的行值:
相关问题 更多 >
编程相关推荐