[英]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.