Python 填充和重塑数据帧

Python 填充和重塑数据帧,python,pandas,padding,Python,Pandas,Padding,我有一个数据框,其形式如下: data = pd.DataFrame({'ID':[1,1,1,2,2,2,2,3,3],'Time':[0,1,2,0,1,2,3,0,1], 'sig':[2,3,1,4,2,0,2,3,5],'sig2':[9,2,8,0,4,5,1,1,0], 'group':['A','A','A','B','B','B','B','A','A']}) print(data)

我有一个数据框,其形式如下:

data = pd.DataFrame({'ID':[1,1,1,2,2,2,2,3,3],'Time':[0,1,2,0,1,2,3,0,1],
                     'sig':[2,3,1,4,2,0,2,3,5],'sig2':[9,2,8,0,4,5,1,1,0],
                     'group':['A','A','A','B','B','B','B','A','A']})

print(data)

   ID  Time  sig  sig2 group
0   1     0    2     9     A
1   1     1    3     2     A
2   1     2    1     8     A
3   2     0    4     0     B
4   2     1    2     4     B
5   2     2    0     5     B
6   2     3    2     1     B
7   3     0    3     1     A
8   3     1    5     0     A
我想重塑和填充,使每个“ID”具有相同数量的时间值,sig1、sig2用零(或ID内的平均值)填充,并且组具有相同的字母值。重新添加后的输出为:

data_pad = pd.DataFrame({'ID':[1,1,1,1,2,2,2,2,3,3,3,3],'Time':[0,1,2,3,0,1,2,3,0,1,2,3],
                     'sig1':[2,3,1,0,4,2,0,2,3,5,0,0],'sig2':[9,2,8,0,0,4,5,1,1,0,0,0],
                     'group':['A','A','A','A','B','B','B','B','A','A','A','A']})

print(data_pad)

    ID  Time  sig1  sig2 group
0    1     0     2     9     A
1    1     1     3     2     A
2    1     2     1     8     A
3    1     3     0     0     A
4    2     0     4     0     B
5    2     1     2     4     B
6    2     2     0     5     B
7    2     3     2     1     B
8    3     0     3     1     A
9    3     1     5     0     A
10   3     2     0     0     A
11   3     3     0     0     A
我的最终目标是最终将其重塑为具有形状的东西(ID的数量、时间点的数量、序列的数量{2 here})


似乎如果我透视
数据
,它将填充nan值,这对于信号值来说是好的,但对于组来说不是。我还希望避免在数据中循环。groupby('ID'),因为我的实际数据有大量的组,循环可能会非常慢。

这里有一种方法,使用
pd.MultiIndex.from_product
创建新索引,并使用它在
Time
列上
重新编制索引:

df = data.set_index(['ID', 'Time'])
# define a the new index
ix = pd.MultiIndex.from_product([df.index.levels[0], 
                                 df.index.levels[1]], 
                                 names=['ID', 'Time'])
# reindex using the above multiindex
df = df.reindex(ix, fill_value=0)
# forward fill the missing values in group
df['group'] = df.group.mask(df.group.eq(0)).ffill()

IIUC:

输出:

    ID group  Time  sig  sig2
0    1     A     0    2     9
1    1     A     1    3     2
2    1     A     2    1     8
3    1     A     3    0     0
4    2     B     0    4     0
5    2     B     1    2     4
6    2     B     2    0     5
7    2     B     3    2     1
8    3     A     0    3     1
9    3     A     1    5     0
10   3     A     2    0     0
11   3     A     3    0     0

您是否可以添加一个更直观的输出格式。我很难理解你到底想做什么。这个问题比你的另一个好得多。
(data.pivot_table(columns='Time', index=['ID','group'], fill_value=0)
     .stack('Time')
     .sort_index(level=['ID','Time'])
     .reset_index()
)
    ID group  Time  sig  sig2
0    1     A     0    2     9
1    1     A     1    3     2
2    1     A     2    1     8
3    1     A     3    0     0
4    2     B     0    4     0
5    2     B     1    2     4
6    2     B     2    0     5
7    2     B     3    2     1
8    3     A     0    3     1
9    3     A     1    5     0
10   3     A     2    0     0
11   3     A     3    0     0