【问题标题】:creating duplicate dictionary as column in pandas在熊猫中创建重复的字典作为列
【发布时间】:2018-01-20 03:14:56
【问题描述】:

dataframe 有一些重复的值。有两种情况重复

  1. 同一 ID 在同一类别中出现两次
  2. 相同的 ID 显示在两个不同的类别中

通常,从 ID 到类别应该有 1-1 映射。

我需要调查这些问题,并想创建一个新的数据框,其中我的 ID 列没有重复值,但我有第二列是字典。字典的键是ID映射到的类别,值是计数。例如,在情况 1 中有一个值为 2 的 1 元素字典,在情况 2 下有一个 2 元素字典,每个键的值为 1。

以下是数据框df的示例。

ID          Category
1001          cat1
1002          cat1
1002          cat1
1003          cat1
1003          cat2
1004          cat2

有什么建议吗?

【问题讨论】:

    标签: python pandas dictionary duplicates


    【解决方案1】:

    可能不是最有效但有效的解决方案:

    from collections import defaultdict
    def list_to_dict(x):
        d = defaultdict(int)
        for key in x:
            d[key]  += 1
        return dict(d)
    
    d = {"ID": pd.Series([1001,1002,1002,1003,1003,1004]), "Category": pd.Series(['cat1','cat1','cat1','cat1','cat2','cat2'])}
    df = pd.DataFrame(d)
    
    df.groupby('ID')['Category'].apply(list).apply(list_to_dict)
    

    输出是:

    ID
    1001                {u'cat1': 1}
    1002                {u'cat1': 2}
    1003    {u'cat1': 1, u'cat2': 1}
    1004                {u'cat2': 1}
    

    【讨论】:

      【解决方案2】:

      代码:

      from collections import Counter
      df2 = df.groupby(["ID"])["Category"].apply(lambda x : Counter(list(x)))
      

      测试:

      df2.loc[1002]["cat1"]
      df2.loc[1003]["cat1"]
      

      结果:

      2.0
      1.0
      

      【讨论】:

      • 不幸的是,您不能以这种方式创建 dict 列 - 或者在可能的情况下使用一些较旧版本的 pandas。在版本 0.20.3 中,它返回新的 SeriesMultiIndex
      【解决方案3】:

      没那么容易 - 使用 groupby 并将 lambda 函数与 value_countsto_dict 一起应用。

      对于dict 列使用技巧 - 在列表中首先创建dict,然后通过str[0] 选择每个列表。

      df1 = df.groupby('ID')['Category']
              .apply(lambda x: [x.value_counts().to_dict()])
              .str[0]
              .reset_index()
      print (df1)
           ID                Category
      0  1001             {'cat1': 1}
      1  1002             {'cat1': 2}
      2  1003  {'cat1': 1, 'cat2': 1}
      3  1004             {'cat2': 1}
      

      【讨论】:

        猜你喜欢
        • 2018-08-06
        • 1970-01-01
        • 2019-10-21
        • 2020-12-01
        • 2016-09-09
        • 2019-12-21
        • 2020-03-21
        • 2020-08-14
        • 2018-02-26
        相关资源
        最近更新 更多