python-3.x Pandas分组,每n次给予一个新的id

7jmck4yq  于 2022-12-30  发布在  Python
关注(0)|答案(2)|浏览(135)

我有这样一个 Dataframe :

df=pd.DataFrame({'id':[100,100,100,100,100,100,100,100,100,100,100,200,200,200,200,200,200]})
'''
    id
0   100
1   100
2   100
3   100
4   100
5   100
6   100
7   100
8   100
9   100
10  100
11  200
12  200
13  200
14  200
15  200

'''

我想使用id列每5个条目分配一个新的id。例如,预期输出:

out=pd.DataFrame({'100_1','100_2','200_1'})
'''
    0
0   100_1  #100 is id. _1 is which group. (0-5)
1   100_2  #_2 is second period of 5. (5-10)
2   200_1

'''

例如,如果有15个相同的id(假设id=400),输出应该如下所示:第一个月

3ks5zfa0

3ks5zfa01#

我能想到的一个不太优雅的解决方案是使用cumcount()

df['cumcount'] = df.groupby('id').cumcount('id')
cond = (df['cumcount'] - 1) % 5 == 0
(df[cond]['id'].astype(str) + '_' + (df[cond]['cumcount'] // 5 + 1).astype(str)).reset_index(drop=True)
soat7uwm

soat7uwm2#

这可能行得通:

# Set the flags when to create count
df['cumcount'] = df.groupby('id').cumcount('id') + 1
df["val"] = np.where(df["cumcount"] % 5 == 0, 1, np.nan)

# Create the new df
df1 = df.dropna().copy().reset_index(drop=True)
df1["cumsum"] = df1.groupby('id')["val"].cumsum().astype(int)
df1["result"] = df1["id"].astype(str) + "_"  + df1["cumsum"].astype(str)

相关问题