Pandas 为每个组生成具有给定列的所有唯一值的行
在此df中,并非每个项目都出现在每个时间点。我希望在每个时间点都有所有唯一的项,这些新插入的项应具有: i如果在以前的时间点未出现NaN值,或 ii如果有,则获取其最新值 所需的输出应该像下面插入了hashtag的行一样Pandas 为每个组生成具有给定列的所有唯一值的行,pandas,pandas-groupby,Pandas,Pandas Groupby,在此df中,并非每个项目都出现在每个时间点。我希望在每个时间点都有所有唯一的项,这些新插入的项应具有: i如果在以前的时间点未出现NaN值,或 ii如果有,则获取其最新值 所需的输出应该像下面插入了hashtag的行一样 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],
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
例如,项1在时间点2得到4.0,因为它有一个时间点1,而项6在时间点1得到一个NaN,因为没有前面的值
现在,我知道,如果我设法插入每个时间点组中缺少的每个唯一项目的所有行,即到达此点:
>>> 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
然后我可以做:
>>> 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
这将返回所需的输出
但是如何将每个时间点组缺少的所有df.item.unique项添加为行
另外,如果您从零开始就有一个更有效的解决方案可供建议,那么请尽一切可能不客气。我认为带取消堆栈的堆栈将实现格式,然后我们使用groupby ffill向前填充nan值
dfx.sort_values(by = ['item', 'timePoint'],
inplace = True,
ascending = [True, True])
dfx['value'] = dfx.groupby('item')['value'].fillna(method='ffill')
使用pd.MULTINDEX.from_产品、级别、重新索引
谢谢你的回答。在pandas'0.19.2'中,当运行第二行时,我得到keyrerror:'item'youneedgroupbylevel='item'然后谢谢。我会改为接受这个答案,因为它同样适用于多个值列。请您用groupbylevel='item'更新您的答案,这样对每个人都有效。这是一个与熊猫版本相关的问题还是其他问题?是的,这是一个版本问题。较新版本允许引用索引级别名称。谢谢您的回答!请多问一个问题。如果我在原始df中有多个值列,例如value1、value2..,是否有任何方法可以遵循此方法,或者我是否必须对每个值列重复此过程,然后合并生成的dfs?@Tony您可以检查Pir的答案
s=df.set_index(['item','timePoint']).value.unstack().stack(dropna=False)
s.groupby(level=0).ffill().reset_index()
Out[508]:
item timePoint 0
0 1 1 2.0
1 1 2 2.0
2 1 3 4.0
3 2 1 4.0
4 2 2 4.0
5 2 3 5.0
6 3 1 7.0
7 3 2 5.0
8 3 3 3.0
9 4 1 6.0
10 4 2 9.0
11 4 3 9.0
12 5 1 NaN
13 5 2 3.0
14 5 3 3.0
15 6 1 NaN
16 6 2 2.0
17 6 3 2.0
18 7 1 NaN
19 7 2 NaN
20 7 3 1.0
d = df.set_index(['item', 'timePoint'])
d.reindex(
pd.MultiIndex.from_product(d.index.levels, names=d.index.names)
).groupby(level='item').ffill().reset_index()
item timePoint value
0 1 1 2.0
1 1 2 2.0
2 1 3 4.0
3 2 1 4.0
4 2 2 4.0
5 2 3 5.0
6 3 1 7.0
7 3 2 5.0
8 3 3 3.0
9 4 1 6.0
10 4 2 9.0
11 4 3 9.0
12 5 1 NaN
13 5 2 3.0
14 5 3 3.0
15 6 1 NaN
16 6 2 2.0
17 6 3 2.0
18 7 1 NaN
19 7 2 NaN
20 7 3 1.0