我使用这种结构处理数据帧:
[timestamp][id][A][B][C][D]
由于许多事情,并非所有数据都被检索到,我最终会得到像
这样的东西2015-05-05 15:00:00 2 NaN NaN NaN 2680
2015-05-05 15:00:00 3 0989 0020 -0011 2680
2015-05-05 15:00:00 4 1022 0060 -0076 2600
2015-05-05 15:00:00 5 NaN NaN NaN 2623
在这种情况下,使用fillna(method="ffill")
将使用'A'
中的id=4
值来填充'A'
的{{1}}值。
然而,我想要完成的是将id=5
的{{1}}值从其先前已知的值(700000)csv条目中填充。 (并以这种方式填充所有列中的所有NaN值)
'A'
变为
id=5
值来自id = 5的最后已知数据,即2014-07-24 17:49:00 5 1046.0 -3.0 -239.0 2800.0
...
2015-05-05 15:00:00 2 NaN NaN NaN 2680
2015-05-05 15:00:00 3 0989 0020 -0011 2680
2015-05-05 15:00:00 4 1022 0060 -0076 2600
2015-05-05 15:00:00 5 NaN NaN NaN 2623
而不是
2015-05-05 15:00:00 2 NaN NaN NaN 2680
2015-05-05 15:00:00 3 0989 0020 -0011 2680
2015-05-05 15:00:00 4 1022 0060 -0076 2600
2015-05-05 15:00:00 5 1046 -3.0 -239.0 2623
当我执行2014-07-24 17:49:00
我的第二个解决方案是2015-05-05 15:00:00 2 NaN NaN NaN 2680
2015-05-05 15:00:00 3 0989 0020 -0011 2680
2015-05-05 15:00:00 4 1022 0060 -0076 2600
2015-05-05 15:00:00 5 1022 0060 -0076 2623
' id'然后做一个fillna
。但这超过了我作为熊猫用户的技能。所以我只是想知道是否有更好的解决方案。
答案 0 :(得分:1)
首先我按ID分组,然后在该组中,我用之前的值填充nans。
df = pd.DataFrame([['2014-07-24 17:49:00', 5, 1046.0, -3, -239, 2800],
['2015-05-05 15:00:00', 2, np.nan, np.nan,np.nan, 2680],
['2015-05-05 15:00:00', 3, 989, 20, -11, 2680],
['2015-05-05 15:00:00', 4, 1022, 60, -76, 2600],
['2015-05-05 15:00:00', 5, np.nan, np.nan, np.nan, 2623]],
columns='timestamp id A B C D'.split())
df.groupby('id').apply(lambda group: group.fillna(method='ffill'))
结果:
timestamp id A B C D
0 2014-07-24 17:49:00 5 1046 -3 -239 2800
1 2015-05-05 15:00:00 2 NaN NaN NaN 2680
2 2015-05-05 15:00:00 3 989 20 -11 2680
3 2015-05-05 15:00:00 4 1022 60 -76 2600
4 2015-05-05 15:00:00 5 1046 -3 -239 2623
修改强>: 这是JoeCondron建议的编辑,这可能是比我更好的答案。我会在这里添加它,直到他将其添加为答案,因为我不想让它丢失:
df.groupby('id', as_index=False).fillna(method='ffill')