我有这样的数据。
输入:
index colA colB colC
0 A 1 QQQ
1 A 1 WWW
2 A 1 EEE
3 A 1 RRR
4 B 2 TTT
5 B 2 YYY
6 B 2 UUU
7 C 1 III 我想用相同的colA在colB时间重复值行。例如,行索引4-6的colA为B,在colB处的值为2,然后我想重复第4-6行两次( 4-6的顺序不变),如输出所示。如果colB值为3,则重复三次,如果值为1,则不要重复。另外,我想添加一个列colC表示colA的索引,这样colA=A没有重复,那么num是0,colA=B有两个重复,num是1和2,.有没有一种优雅的方法可以在熊猫身上做到这一点?
输出:
index colA colB colC num
0 A 1 QQQ 0
1 A 1 WWW 0
2 A 1 EEE 0
3 A 1 RRR 0
4 B 2 TTT 1
5 B 2 YYY 1
6 B 2 UUU 1
7 B 2 TTT 2
8 B 2 YYY 2
9 B 2 UUU 2
10 C 1 III 3发布于 2022-03-17 11:11:00
使用自定义函数按顺序重复(在许多组中慢)和keys参数,因此可以通过GroupBy.ngroup添加新列num
def f(x):
pos = int(x.iat[0, x.columns.get_loc('colB')])
return pd.concat([x] * pos, keys=range(pos))
df = df.groupby('colA', group_keys=False, sort=False).apply(f).reset_index(level=0)
df['num'] = df.groupby(['level_0','colA'], sort=False).ngroup()
df = df.drop('level_0', axis=1)
print (df)
colA colB colC num
index
0 A 1 QQQ 0
1 A 1 WWW 0
2 A 1 EEE 0
3 A 1 RRR 0
4 B 2 TTT 1
5 B 2 YYY 1
6 B 2 UUU 1
4 B 2 TTT 2
5 B 2 YYY 2
6 B 2 UUU 2
7 C 1 III 3发布于 2022-03-17 11:06:37
您可以使用index.repeat复制索引,使用GroupBy.cumcount计算"num“列:
(df
.loc[df.index.repeat(df['colB'])]
.assign(num=lambda d: d.groupby(['colA', 'colC']).cumcount().cumsum())
)产出:
index colA colB colC num
0 0 A 1 QQQ 0
1 1 A 1 WWW 0
2 2 A 1 EEE 0
3 3 A 1 RRR 0
4 4 B 2 TTT 0
4 4 B 2 TTT 1
5 5 B 2 YYY 1
5 5 B 2 YYY 2
6 6 B 2 UUU 2
6 6 B 2 UUU 3
7 7 C 1 III 3https://stackoverflow.com/questions/71511193
复制相似问题