如何在pandas中执行groupby()和value_counts()等操作?

时间:2016-08-23 06:27:38

标签: python pandas dataframe group-by crosstab

这是一个pandas Dataframe定义如下:

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo', 'foo'],
                   'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three', 'two'],
                   'C' : [0, 1, 0, 1, 1, 2, 0, 2, 1]})
>>> df
     A      B  C
0  foo    one  0
1  bar    one  1
2  foo    two  0
3  bar  three  1
4  foo    two  1
5  bar    two  2
6  foo    one  0
7  foo  three  2
8  foo    two  1

我想做两个操作。

首先,按列AB对数据框进行分组。因此,在这种情况下获得6组。此操作类似于pandas中的groupby()函数。

然后,对于每个组,对列C执行计数操作,因为在这种情况下它可以是三个不同的值(0,1和2)。此操作类似于pandas中的value_counts()函数。

最后,我想要一个像这样的新数据帧。

     A      B  C_value0  C_value1  C_value2
0  foo    one         2         0         0
1  foo    two         1         2         0
2  foo  three         0         0         1
3  bar    one         0         1         0
4  bar    two         0         0         1
5  bar  three         0         1         0

有人可以告诉我如何实现这个目标吗?谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用groupby汇总size,然后将0替换为int fillna,将pandas转换为astype add_prefix },reset_indexrename_axis和最后crosstab0.18.0 print (df.groupby(['A','B', 'C'])['C'].size() .unstack() .fillna(0) .astype(int) .add_prefix('C_value') .reset_index() .rename_axis(None, axis=1)) A B C_value0 C_value1 C_value2 0 bar one 0 1 0 1 bar three 0 1 0 2 bar two 0 0 1 3 foo one 2 0 0 4 foo three 0 0 1 5 foo two 1 2 0 中的新内容):

print (pd.crosstab([df.A, df.B], df.C)
         .add_prefix('C_value') 
         .reset_index()
         .rename_axis(None, axis=1))

     A      B  C_value0  C_value1  C_value2
0  bar    one         0         1         0
1  bar  three         0         1         0
2  bar    two         0         0         1
3  foo    one         2         0         0
4  foo  three         0         0         1
5  foo    two         1         2         0

https://api.jquery.com/jquery.getscript/的另一个解决方案:

$.getScript("location of my script to open the modal here");