Python - 按列A + B分组,并为每个唯一出现的A + B计算列C的行值

时间:2017-12-17 02:15:27

标签: python pandas pandas-groupby

我讨厌不得不问,但我已经搜索了很多小时来解决这个问题。我和熊猫很亲密,但还不够近。这让我很生气,因为我知道它一定是可能的! 所以我有一个类似这样的data_frame:

df = pd.DataFrame(
              {'Path': ['Yellow','Yellow','Blue','Green','Yellow','Blue','Yellow','Yellow'], 
               'Type': ['Image','Video','Image','Video','Video','Video','Image','Image'], 
               'Category': [A,A,B,A,B,A,C,C],
              },

我试过了:

A = df[(df['Category'] == 'A') & (df['Type'] == 'Image')]
A = A.groupby(['Path']).size().reset_index(name='Count of A')

但这仅返回一个'类别'及其类型'每个独特的路径'一次。理想情况下,我想对数据进行分组,以便输出类似于此的内容:

Path   | Type  | Count of A | Count of B | Count of C |
Yellow | Image |      1     |            |     2      |
       | Video |      1     |      1     |            |
Green  | Image |            |            |            |
       | Video |      1     |            |            |
Blue   | Image |            |      1     |            |
       | Video |      1     |            |            |

即使我一次可以做一个比我目前输出的更好的路径。

我希望有人能看到解决方案并让我摆脱痛苦!?

1 个答案:

答案 0 :(得分:2)

仍在使用groupby + value_counts

    df.groupby(['Path','Type']).Category.apply(pd.value_counts).unstack().fillna('')
Out[121]: 
              A  B  C
Path   Type          
Blue   Image     1   
       Video  1      
Green  Video  1      
Yellow Image  1     2
       Video  1  1   

或者我们使用pivot_table

pd.pivot_table(df.reset_index(),index=['Path','Type'],columns=['Category'],values='index',aggfunc='count')
Out[123]: 
Category        A    B    C
Path   Type                
Blue   Image  NaN  1.0  NaN
       Video  1.0  NaN  NaN
Green  Video  1.0  NaN  NaN
Yellow Image  1.0  NaN  2.0
       Video  1.0  1.0  NaN