熊猫:在数据框的组中添加行

时间:2019-08-22 17:47:47

标签: python pandas dataframe

我的数据框如下:

df = pd.DataFrame({"date": [1,2,5,6,2,3,4,5,1,3,4,5,6,1,2,3,4,5,6],
               "variable": ["A","A","A","A","B","B","B","B","C","C","C","C","C","D","D","D","D","D","D"]})
   date variable
0   1   A
1   2   A
2   5   A
3   6   A
4   2   B
5   3   B
6   4   B
7   5   B
8   1   C
9   3   C
10  4   C
11  5   C
12  6   C
13  1   D
14  2   D
15  3   D
16  4   D
17  5   D
18  6   D

在此数据框中,variable列中有4个值:A,B,C,D。我的目标是每个变量在{{1}中需要包含1到6个日期}列。

但是,当前,date中缺少日期列中的一些值。我尝试将它们分组并用计数器填充每个值,但有时缺少多个日期(例如,在variable A中,缺少日期4和5)。另外,由于我有成千上万的行,所以计数器使我的代码非常慢。

是否有一种更快捷,更聪明的方法而无需使用计数器?

所需的输出应如下:

variable

3 个答案:

答案 0 :(得分:2)

itertools.product

from itertools import product

pd.DataFrame([*product(
    range(df.date.min(), df.date.max() + 1),
    sorted({*df.variable})
)], columns=df.columns)

    date variable
0      1        A
1      1        B
2      1        C
3      1        D
4      2        A
5      2        B
6      2        C
7      2        D
8      3        A
9      3        B
10     3        C
11     3        D
12     4        A
13     4        B
14     4        C
15     4        D
16     5        A
17     5        B
18     5        C
19     5        D
20     6        A
21     6        B
22     6        C
23     6        D

答案 1 :(得分:1)

使用grpupby + reindex

df.groupby('variable', as_index=False).apply(
           lambda g: g.set_index('date').reindex([1,2,3,4,5,6]).ffill().bfill())
           .reset_index(level=1)

输出:

 date   variable
0   1   A
0   2   A
0   3   A
0   4   A
0   5   A
0   6   A
1   1   B
1   2   B
1   3   B
1   4   B
1   5   B
1   6   B
2   1   C
2   2   C
2   3   C
2   4   C
2   5   C
2   6   C
3   1   D
3   2   D
3   3   D
3   4   D
3   5   D
3   6   D

答案 2 :(得分:0)

这更多的是可以解决的,但应该可以解决

df.groupby(by=['variable']).agg({'date': range(6)}).explode('date')