使用pandas

时间:2015-05-26 07:14:00

标签: python pandas

我使用这种结构处理数据帧:

[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。但这超过了我作为熊猫用户的技能。所以我只是想知道是否有更好的解决方案。

1 个答案:

答案 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')