【问题标题】:Number duplicates sequentially in Pandas DataFrame在 Pandas DataFrame 中按顺序编号重复项
【发布时间】:2017-01-21 17:43:34
【问题描述】:

我有一个 Pandas DataFrame,它有一列基本上是外键,如下所示:

Index   |  f_key  |    values
  0     |    1    |     red 
  1     |    2    |     blue 
  2     |    1    |     green 
  3     |    2    |     yellow 
  4     |    3    |     orange 
  5     |    1    |     violet

我想要添加一个按顺序标记重复外键的列,如下面的“dup_number”:

Index   | dup_number |  f_key  |    values
  0     |     1      |    1    |     red 
  1     |     1      |    2    |     blue 
  2     |     2      |    1    |     green 
  3     |     2      |    2    |     yellow 
  4     |     1      |    3    |     orange 
  5     |     3      |    1    |     violet

如果需要,行可以重新排序,我只需要在其中获取“dup_number”键。我编写了以下代码,效果很好,它给了我一个系列,然后我可以将其添加到 DataFrame 中,但它非常慢(for 循环是什么消磨时间),而且我觉得它比需要的复杂得多:

df = pd.DataFrame({'f_key': [1,2,1,2,3,1], 'values': ['red', 'blue', 'green', 'yellow', 'orange', 'violet']})
df_unique = df['f_key'].drop_duplicates().reset_index(drop=True)
dup_number = pd.DataFrame(columns = ['dup_number', 'temp_index'])
for n in np.arange(len(df_unique)):
    sub_df = df.loc[df['f_key'] == df_unique[n]].reset_index()
    dup_index = pd.DataFrame({'dup_number': sub_df.index.values[:]+1, 'temp_index': sub_df['index']})
    dup_number = dup_number.append(dup_index)
dup_number = dup_number.set_index(dup_number['temp_index'].astype(int))
dup_number = dup_number['dup_number'].sort_index()

任何关于更快/更简单方法的建议都非常感谢!

【问题讨论】:

    标签: python pandas dataframe duplicates foreign-keys


    【解决方案1】:

    您可以使用cumcount()

    df['dup_number'] = df.groupby(['f_key']).cumcount()+1
    
               f_key  values  dup_number
        0      1     red           1
        1      2    blue           1
        2      1   green           2
        3      2  yellow           2
        4      3  orange           1
        5      1  violet           3
    

    【讨论】:

      【解决方案2】:

      以下是与this question 中列出的解决方案类似的解决方案。这是适用于此处的答案之一的修改版本:

      import pandas as pd
      df = pd.DataFrame({'index':[0,1,2,3,4,5],'f_key':[1,2,1,2,3,1]
                    ,'values':['red','blue','green','yellow','orange','violet']})
      
      df['duplicate_num']=df.sort_values('index') \
          .groupby('f_key') \
          .cumcount() + 1
      

      本质上,我们将窗口函数(概念上)应用于数据帧,并为重复外键值的每个实例(按索引排序)生成一个行号。

      【讨论】:

        猜你喜欢
        • 2018-02-14
        • 2018-01-26
        • 2018-08-20
        • 2013-03-22
        • 2017-01-09
        • 2014-11-29
        • 2016-01-31
        • 2018-08-20
        • 2016-10-26
        相关资源
        最近更新 更多