【发布时间】:2018-03-30 14:48:37
【问题描述】:
df = pd.DataFrame({'timePoint': [1,1,1,1,2,2,2,2,3,3,3,3],
'item': [1,2,3,4,3,4,5,6,1,3,7,2],
'value': [2,4,7,6,5,9,3,2,4,3,1,5]})
>>> df
item timePoint value
0 1 1 2
1 2 1 4
2 3 1 7
3 4 1 6
4 3 2 5
5 4 2 9
6 5 2 3
7 6 2 2
8 1 3 4
9 3 3 3
10 7 3 1
11 2 3 5
在这个df 中,并不是每个item 都出现在每个timePoint 上。我想在每个timePoint 上都有所有唯一的items,而这些新插入的items 应该有:
(i) NaN value 如果他们没有出现在之前的timePoint 中,或者
(ii) 如果有,他们会得到最近的value。
所需的输出应如下所示(带有标签的行是插入的行)。
>>> dfx
item timePoint value
0 1 1 2.0
3 1 2 2.0 #
8 1 3 4.0
1 2 1 4.0
4 2 2 4.0 #
11 2 3 5.0
2 3 1 7.0
4 3 2 5.0
9 3 3 3.0
3 4 1 6.0
5 4 2 9.0
6 4 3 9.0 #
0 5 1 NaN #
6 5 2 3.0
7 5 3 3.0 #
1 6 1 NaN #
7 6 2 2.0
8 6 3 2.0 #
2 7 1 NaN #
5 7 2 NaN #
10 7 3 1.0
例如,item 1 在timePoint 2 得到一个4.0,因为这就是它有一个timePoint 1 而item 6 在@2@34 得到一个@987654 987654343@1,因为前面没有value。
现在,我知道如果我设法在每个 timePoint group 中插入每个唯一 item 缺失的所有行,即达到这一点:
>>> dfx
item timePoint value
0 1 1 2.0
1 2 1 4.0
2 3 1 7.0
3 4 1 6.0
4 3 2 5.0
5 4 2 9.0
6 5 2 3.0
7 6 2 2.0
8 1 3 4.0
9 3 3 3.0
10 7 3 1.0
11 2 3 5.0
0 5 1 NaN
1 6 1 NaN
2 7 1 NaN
3 1 2 NaN
4 2 2 NaN
5 7 2 NaN
6 4 3 NaN
7 5 3 NaN
8 6 3 NaN
那我可以做:
dfx.sort_values(by = ['item', 'timePoint'],
inplace = True,
ascending = [True, True])
dfx['value'] = dfx.groupby('item')['value'].fillna(method='ffill')
这将返回所需的输出。
但是如何将所有 df.item.unique() items 添加为每个 timePoint group 中缺少的行?
另外,如果你有一个更有效的解决方案可以从头开始建议,那么请务必成为我的客人。
【问题讨论】:
标签: pandas pandas-groupby