猿问

有没有办法对 pandas 数据框中的一组重复项目进行编号?

我有一个包含区域、客户和一些交付的数据框。此列用作购买类型,第一次和最后一次购买被标记为“第一次”和“最后一次”,但任何中间交付都被标记为“交付”是否有一种方法可以转换交付并获得标签“交货 1”、“交货 2”等?


import pandas as pd  

data = [['NY', 'A','FIRST', 10], ['NY', 'A','DELIVERY', 20], ['NY', 'A','DELIVERY', 30], ['NY', 'A','LAST', 25],

       ['NY', 'B','FIRST', 15], ['NY', 'B','DELIVERY', 10], ['NY', 'B','LAST', 20],

       ['FL', 'A','FIRST', 15], ['FL', 'A','DELIVERY', 10], ['NY', 'A','DELIVERY', 12], ['NY', 'A','DELIVERY', 25], ['NY', 'A','LAST', 20]

       ] 

  

# Create the pandas DataFrame 

df = pd.DataFrame(data, columns = ['Region', 'Client', 'purchaseType', 'price']) 

  

# print dataframe. 

df 

期望的输出:


data2 = [['NY', 'A','FIRST', 10], ['NY', 'A','DELIVERY1', 20], ['NY', 'A','DELIVERY2', 30], ['NY', 'A','LAST', 25],

       ['NY', 'B','FIRST', 15], ['NY', 'B','DELIVERY1', 10], ['NY', 'B','LAST', 20],

       ['FL', 'A','FIRST', 15], ['FL', 'A','DELIVERY1', 10], ['NY', 'A','DELIVERY2', 12], ['NY', 'A','DELIVERY3', 25], ['NY', 'A','LAST', 20]

       ] 


df2 = pd.DataFrame(data2, columns = ['Region', 'Client', 'purchaseType', 'price']) 

print(df2)

提前致谢!


慕仙森
浏览 123回答 2
2回答

子衿沉夜

您可以使用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  price0      NY      A        FIRST     101      NY      A    DELIVERY1     202      NY      A    DELIVERY2     303      NY      A         LAST     254      NY      B        FIRST     155      NY      B    DELIVERY1     106      NY      B         LAST     207      FL      A        FIRST     158      FL      A    DELIVERY1     109      NY      A    DELIVERY2     1210     NY      A    DELIVERY3     2511     NY      A         LAST     20

30秒到达战场

我们可以尝试使用GroupBy.cumcountandSeries.str.catblocks = 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_valuesprint(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
随时随地看视频慕课网APP

相关分类

Python
我要回答