Python 我可以用多索引对熊猫数据帧进行重采样吗

Python 我可以用多索引对熊猫数据帧进行重采样吗,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个看起来像这样的数据帧,在'timestamp','id'上有一个多索引: 我想在值上按时间转发填充,以便使用最新可用的数据项填充数据帧,即数据帧变为: 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-0

我有一个看起来像这样的数据帧,在'timestamp','id'上有一个多索引:

我想在值上按时间转发填充,以便使用最新可用的数据项填充数据帧,即数据帧变为:

                 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

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

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

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

您可以对第二个级别和ffill进行排序,然后像原始级别一样重新编制索引:

df.sort_index(level=1).ffill().reindex(df.index)
您还可以使用堆栈以正确的二维表示形式排列数据,以便按列填充,然后取消堆栈返回原始格式。这将分别处理列(即索引),而不是滚动数据值,这在给出的另一个解决方案中就是如此

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
可以使用.stack将其恢复为原始格式

将其与df.sort\u indexlevel=1.ffill.reindexdf.index进行比较,差异出现在最后一列中,因为“C”以NaN开头,所以“B”中的值1被滚到“C”的开头,表示“Value2”。

您也可以使用堆栈以正确的二维表示形式排列数据,以便按列填充,然后取消堆栈回到原始值总体安排这将分别处理列(即索引),而不是滚动数据值,这在给出的另一个解决方案中就是如此

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
可以使用.stack将其恢复为原始格式


将其与df.sort_indexlevel=1.ffill.reindexedf.index进行比较,差异出现在最后一列中,因为“C”以NaN开头,1的“B”值被滚动到“C”的开头,表示“Value2”。

你能试试df.sort_indexaxaxis=0,level=0,sort_remaining=False.fillnamethod='ffill.astypenp.int64你能试试df.sort_indexaxaxis=0,level=0吗,sort_remaining=False.fillnamethod='ffill'.astypenp.int64如果有一个初始值,就像在我的示例中一样,可以为级别1中的每个项目向前填充,那么这个方法很有效。如果没有,那么a中的值可以溢出到B中,或者B溢出到C中。但是我可以解决这个问题。所以谢谢你的回答+1解决方法是什么?如果有一个初始值(如我的示例中所示),则可以为级别1中的每个项目进行正向填充。如果没有,那么a中的值可以溢出到B中,或者B溢出到C中。但是我可以解决这个问题。所以谢谢你的回答+1有什么工作要做?
            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