2 回答

TA貢獻1828條經驗 獲得超3個贊
您可以使用np.where來決定在哪里添加數字后綴:
df['purchaseType'] = df.groupby((df['purchaseType']=='FIRST').cumsum())['purchaseType'].transform(
lambda x: np.where(x=='DELIVERY', x+np.arange(len(x)).astype(str), x)
)
print(df)
印刷:
Region Client purchaseType price
0 NY A FIRST 10
1 NY A DELIVERY1 20
2 NY A DELIVERY2 30
3 NY A LAST 25
4 NY B FIRST 15
5 NY B DELIVERY1 10
6 NY B LAST 20
7 FL A FIRST 15
8 FL A DELIVERY1 10
9 NY A DELIVERY2 12
10 NY A DELIVERY3 25
11 NY A LAST 20

TA貢獻1828條經驗 獲得超6個贊
我們可以嘗試使用GroupBy.cumcount
andSeries.str.cat
blocks = df['purchaseType'].eq('FIRST').cumsum()
fill_values = df['purchaseType'].str.cat(df.groupby(blocks)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?.cumcount().astype(str),?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?sep='')
df.loc[df['purchaseType'].eq('DELIVERY'), 'purchaseType'] = fill_values
print(df)
#? ? Region Client purchaseType? price
# 0? ? ? NY? ? ? A? ? ? ? FIRST? ? ?10
# 1? ? ? NY? ? ? A? ? DELIVERY1? ? ?20
# 2? ? ? NY? ? ? A? ? DELIVERY2? ? ?30
# 3? ? ? NY? ? ? A? ? ? ? ?LAST? ? ?25
# 4? ? ? NY? ? ? B? ? ? ? FIRST? ? ?15
# 5? ? ? NY? ? ? B? ? DELIVERY1? ? ?10
# 6? ? ? NY? ? ? B? ? ? ? ?LAST? ? ?20
# 7? ? ? FL? ? ? A? ? ? ? FIRST? ? ?15
# 8? ? ? FL? ? ? A? ? DELIVERY1? ? ?10
# 9? ? ? NY? ? ? A? ? DELIVERY2? ? ?12
# 10? ? ?NY? ? ? A? ? DELIVERY3? ? ?25
# 11? ? ?NY? ? ? A? ? ? ? ?LAST? ? ?20
添加回答
舉報