簡體   English   中英

Pandas:在數據幀的組中添加行

[英]Pandas: Add rows in the groups of a 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。我的目標是每個變量都需要在date列中包含 1 到 6 個日期。

但是目前,某些variable在日期列中缺少一些variable 我嘗試將它們分組並用計數器填充每個值,但有時缺少多個日期(例如,在variable A 中,缺少日期 4 和 5)。 此外,計數器使我的代碼非常慢,因為我有幾千行。

有沒有更快更聰明的方法來做到這一點而不使用計數器?

所需的輸出應如下所示:

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

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

使用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

這更像是一種解決方法,但它應該有效

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

你可以這樣做:

var=df['variable'].unique().tolist()
i=0
for j in var:
    long = df.loc[df['variable']==var[i]].shape[0]
    while long <6:
        df.loc[df.shape[0]]=[long,var[i]]
        long=long+1
        df=df.sort_values(['variable','date']).reset_index(drop=True)
    df.loc[df['variable']==var[i],'date']=list(range(1,7))
    i+=1
df

輸出:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM