Pandas 为每个组生成具有给定列的所有唯一值的行

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中,并非每个项目都出现在每个时间点。我希望在每个时间点都有所有唯一的项,这些新插入的项应具有:

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],
                       '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