我的数据框如下:
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
答案 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')