【问题标题】:Drop rows in pandas if records in two columns do not appear together at least twice in the dataset如果两列中的记录没有在数据集中至少出现两次,则删除 pandas 中的行
【发布时间】:2019-07-08 10:38:01
【问题描述】:

我有一个包含日期和公司名称的数据集。我只想保留行,以便公司名称和日期的组合至少出现在数据集中两次。

为了说明问题,让我们假设我有以下数据框:

df1 = pd.DataFrame(np.array([['28/02/2017', 'Apple'], ['28/02/2017', 'Apple'], ['31/03/2017', 'Apple'],['28/02/2017', 'IBM'],['28/02/2017', 'WalMart'],
['28/02/2017', 'WalMart'],['03/07/2017', 'WalMart']]), columns=['date','keyword'])

我想要的输出是:

df2 = pd.DataFrame(np.array([['28/02/2017', 'Apple'], ['28/02/2017', 'Apple'],
                             ['28/02/2017', 'WalMart'],
                             ['28/02/2017', 'WalMart']]), columns=['date', 'keyword'])

我知道如何根据两列中的条件删除行,但我不知道如何根据数据集中两个值的组合出现的次数来删除行。

谁能提供一些见解?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用DataFrame.duplicated 指定列用于检查欺骗,keep=False 用于通过boolean indexing 返回所有欺骗行:

    df2 = df1[df1.duplicated(subset=['date','keyword'], keep=False)]
    print (df2)
             date  keyword
    0  28/02/2017    Apple
    1  28/02/2017    Apple
    4  28/02/2017  WalMart
    5  28/02/2017  WalMart
    

    如果需要指定行数,请使用GroupBy.transform,计数为GroupBy.size

    df2 = df1[df1.groupby(['date','keyword'])['date'].transform('size') >= 2]
    

    如果小 DataFrame 或性能不重要,请使用 filter:

    df2 = df1.groupby(['date','keyword']).filter(lambda x: len(x) >= 2)
    print (df2)
             date  keyword
    0  28/02/2017    Apple
    1  28/02/2017    Apple
    4  28/02/2017  WalMart
    5  28/02/2017  WalMart
    

    【讨论】:

      【解决方案2】:
      df1.groupby(['date','keyword']).apply(lambda x: x if len(x) >= 2 else None).dropna()
      

      输出

               date  keyword
      0  28/02/2017    Apple
      1  28/02/2017    Apple
      4  28/02/2017  WalMart
      5  28/02/2017  WalMart
      

      【讨论】:

      • 你不需要 if 在你的 lambda - 它应该就足够了 lambda x: len(x) >= 2)
      • 感谢您的反馈
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 2020-04-23
      • 2020-01-16
      • 1970-01-01
      相关资源
      最近更新 更多