我可以使用MultiIndex重新采样(填充)pandas DataFrame吗

时间:2020-03-07 09:39:12

标签: python pandas dataframe

我有一个像这样的数据框,其('timestamp', 'id')上有一个MultiIndex:

                 value
timestamp   id
2020-03-03  A    100
2020-03-03  B    222
2020-03-03  C    5000
2020-03-04  A    NaN
2020-03-04  B    1
2020-03-04  C    NaN
2020-03-05  A    200
2020-03-05  B    NaN
2020-03-05  C    NaN
2020-03-06  A    NaN
2020-03-06  B    20
2020-03-06  C    NaN

我想在value上(按时间顺序)转发填充,以便用最新可用的数据项填充数据框,即DataFrame变为:

                 value
timestamp   id
2020-03-03  A    100
2020-03-03  B    222
2020-03-03  C    5000
2020-03-04  A    100
2020-03-04  B    1
2020-03-04  C    5000
2020-03-05  A    200
2020-03-05  B    1
2020-03-05  C    5000
2020-03-06  A    200
2020-03-06  B    20
2020-03-06  C    5000

使用重采样器有什么简单的方法吗?

2 个答案:

答案 0 :(得分:2)

您可以对第二级进行排序并填充,然后像原始索引一样重新编制索引:

df.sort_index(level=1).ffill().reindex(df.index)

                value
timestamp  id        
2020-03-03 A    100.0
           B    222.0
           C   5000.0
2020-03-04 A    100.0
           B      1.0
           C   5000.0
2020-03-05 A    200.0
           B      1.0
           C   5000.0
2020-03-06 A    200.0
           B     20.0
           C   5000.0

答案 1 :(得分:1)

您还可以使用stack以正确的2D表示形式排列数据,以进行填充(列方式),然后将其解堆叠为原始格式。相对于对数据值进行翻转,这会分开处理列(即索引),在给出的其他解决方案中就是这种情况。

a = ['2020-03-03','2020-03-04','2020-03-05', '2020-03-06']
b = ['A', 'B', 'C']
c = ['value1', 'value2']
df = pd.DataFrame(data=None, index=pd.MultiIndex.from_product([a,b]), columns=c)
df.loc[('2020-03-03', slice(None)), 'value1'] = np.array([100, 222, 5000])
df.loc[('2020-03-04', 'B'), 'value1'] = 1.0
df.loc[('2020-03-05', 'A'), 'value1'] = 200.0
df.loc[('2020-03-06', 'C'), 'value1'] = 20
df['value2'] = df['value1']
df.loc[('2020-03-03', 'C'), 'value2'] = np.nan
df

                 value1  value2
timestamp   id
2020-03-03  A    100     100
2020-03-03  B    222     222
2020-03-03  C    5000    NaN   # <- OBS!
2020-03-04  A    NaN     NaN
2020-03-04  B    1       1
2020-03-04  C    NaN     NaN
2020-03-05  A    200     200
2020-03-05  B    NaN     NaN
2020-03-05  C    NaN     NaN
2020-03-06  A    NaN     NaN
2020-03-06  B    20      20
2020-03-06  C    NaN     NaN

使用df.unstack().fillna(method='ffill')给出

            value1             value2
            A     B     C      A     B     C
timestamp
2020-03-03  100   222  5000    100   222   NaN
2020-03-04  100   1    5000    100   1     NaN
2020-03-05  200   1    5000    200   1     NaN
2020-03-06  200   1    20      200   1     20

可以使用.stack()将其恢复为原始格式。

将其与df.sort_index(level=1).ffill().reindex(df.index)进行比较,区别在于最后一列,因为'C'以NaN开头,因此'B'的值1会被滚动到'C'的开头Value2'。

相关问题