【问题标题】:Applying pandas groupby for each index为每个索引应用 pandas groupby
【发布时间】:2017-06-11 14:30:48
【问题描述】:

我有一个以人名作为索引的数据框(可以有多个条目)和两列“X”和“Y”。 'X' 和 'Y' 列可以是 A-C 之间的任何字母。

例如:

df = pd.DataFrame({'X' : ['A', 'B', 'A', 'C'], 'Y' : ['B', 'A', 'A', 'C']},index = ['Bob','Bob','John','Mike'])

对于每个人(即索引),我想获取列“X”和“Y”的每个唯一组合的出现次数(例如 - 对于 Bob,我有 1 个计数('A','B ') 和 1 个计数 ('B','A'))。

当我执行以下操作时:

df.loc['Bob'].groupby(['X','Y']).size() 

我得到了 Bob 的正确结果。如果没有 oop,我怎样才能为每个人做到这一点? 理想情况下,我会得到一个数据框,其中不同的人作为索引,列“X”和“Y”的每个唯一组合作为列,并将它在数据框中出现的次数作为值。

    ('A','A') ('A','B') ('A','C') ('B','A') ... ('C','C')
Bob     0         1         0         1             0
John    1         0         0         0             0
Mike    0         0         0         0             1

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用get_dummies 和groupby

    pd.get_dummies(df.apply(tuple, 1)).groupby(level=0).sum()
    
          (A, A)  (A, B)  (B, A)  (C, C)
    Bob        0       1       1       0
    John       1       0       0       0
    Mike       0       0       0       1
    

    【讨论】:

      【解决方案2】:

      我认为你可以使用:

      #convert columns X and Y to tuples
      df['tup'] = list(zip(df.X, df.Y))
      
      #get size and reshape
      df1 = df.reset_index().groupby(['index','tup']).size().unstack(fill_value=0)
      print (df1)
      tup    (A, A)  (A, B)  (B, A)  (C, C)
      index                                
      Bob         0       1       1       0
      John        1       0       0       0
      Mike        0       0       0       1
      
      #get all unique combination
      from  itertools import product
      comb = list(product(df.X.unique(), df.Y.unique()))
      print (comb)
      [('A', 'B'), ('A', 'A'), ('A', 'C'), ('B', 'B'), ('B', 'A'), 
       ('B', 'C'), ('C', 'B'), ('C', 'A'), ('C', 'C')]
      
      #reindex columns by this combination
      print (df1.reindex(columns=comb, fill_value=0))
      tup    (A, B)  (A, A)  (A, C)  (B, B)  (B, A)  (B, C)  (C, B)  (C, A)  (C, C)
      index                                                                        
      Bob         1       0       0       0       1       0       0       0       0
      John        0       1       0       0       0       0       0       0       0
      Mike        0       0       0       0       0       0       0       0       1
      

      【讨论】:

      • 为了更好地理解pandas,有没有办法用pivot_table做到这一点?
      • pivot_table 的解决方案是df1 = df.reset_index().pivot_table(index='index', columns='tup', aggfunc='size', fill_value=0),crosstab 的解决方案是df1 = pd.crosstab(df.index, df.tup)
      猜你喜欢
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 1970-01-01
      • 2020-10-16
      • 2020-01-27
      • 2018-08-29
      相关资源
      最近更新 更多