2017-06-01 67 views
1

我有两个数据帧具有相同的列。第二列是第一列的索引值的子集,但其中一些列的空字段和其他列的更新信息。检查一个大熊猫数据帧的元素更新另一个

例子:

DFA:

  Height Weight Age Street PhoneNumber 

Pete  5.2  130  33 Pine 123-456-7890 
Mary  5.0  110  34 Main 434-444-5555 
Rob  6.0  230  44 Maple 999-444-2222 
.... 

DFB:

 Height Weight Age Street PhoneNumber 

Pete  Nan  125  Nan Arbor  Nan 
Rob  Nan  235  45  Nan 776-333-3222 

我想在dfb新的信息来更新字段dfa。如果没有更新dfb(该字段是Nan),我想保留原始值dfa

我能想到做到这一点的唯一方法是通过行和列进行迭代,找到dfb的元素,然后在dfa等于dfb地址设置相应的地址。丑陋。

是否有更干净(更pythonic)的方式来做到这一点?

在此先感谢。

编辑:为清晰起见,更改了dfb。这两个dfs没有相同的索引。 dfb是dfa的一个子集。

回答

5

你需要的是combine_first确保那些 “南” 是真正第一np.nan:

dfb = dfb.replace('Nan',np.nan) 
dfb.combine_first(dfa) 

输出:

 Height Weight Age Street PhoneNumber 
Pete  5.2 125 33 Arbor 123-456-7890 
Mary  5.0 110 34 Main 434-444-5555 
Rob  6.0 235 45 Maple 776-333-3222 
+0

有趣。文件说'a的值优先使用b来填补漏洞'。我还没有测试过,但是如果我正确理解使用了a的值(即使为空),但是如果存在来自b的非空值(其中index.a = = index.b),则会被替换。是对的吗? – Windstorm1981

+0

输出来自'dfb'。然后您需要将其重新分配给'dfa',或者之后将'dfb'用作完成的数据帧。我相信'更新'是一个更干净的解决方案。 – Alexander

+0

如果您想放弃原始数据框中的更改跟踪,请选择清理程序。我认为如果您给用户选择重新分配或创建新的dfc会更安全,因此如果需要的话,他们可以返回原始数据框。 –

1

如果DFB的指标是一样的DFA,也许使用一些面具,像

mask = dfb.notnull() 
dfa[mask] = dfb[mask] 
+0

不幸的是,索引是不一样的。 dfb.index是dfa.index – Windstorm1981

+0

的一个子集显然(我做了检查),即使dfb索引和列是dfa的一个子集,它也可以工作,无论如何,我发现其他解决方案更合适 –

+0

谢谢。我完全不熟悉口罩。我将不得不阅读以了解如何申请。带有掩码的概念只需在一个对象中“分组识别”值,以便将它们应用于第二个相同(或几乎相同)的对象? – Windstorm1981

1

你在找什么是fillna(),带走OOK这里 link

你的情况只是在做 dfb.fillna(dfa)

应该工作

+0

很酷。我不知道你可以像这样在数据框级别上使用fillna()。但请看我的编辑。 dfb实际上是dfa观察的一个子集。因此,如果我做了'dfb.fillna(dfa)',我会失去'dfa'中不在'dfb'中的所有行。你的建议可能有用吗? – Windstorm1981

+0

至少在我做的测试中它是一样的,否则combine_first()看起来非常有吸引力 – gionni

+0

'fillna'只是用'dfb'的值更新'dfa'中的NaN值。 OP要求'dfb'中的所有非空值用于更新'dfa'。 – Alexander

1

你只是想update原来的数据帧:

dfa.update(dfb) 

>>> dfa 

     Height Weight Age Street PhoneNumber 
Pete 5.2  125  33 Arbor 123-456-7890 
Mary 5.0  110  34 Main 434-444-5555 
Rob  6.0  235  45 Maple 776-333-3222 

update使用非NA修改原始数据帧中的目的地从值第二个数据帧。

相关问题