根据标准计算出现次数

时间:2015-03-02 19:19:46

标签: python csv pandas aggregate

我正在尝试计算颜色在数据框中显示的总次数,但我只希望它根据所选条件选择它们。 例如,我有:

imageName     color1     color2     color3     color4     shape
img1          Red        Red        Red        Red        circle
img2          Blue       Green      Red        Blue       circle
img3          Yellow     Blue       Red        White      square
img4          Blue       Blue       Blue       Blue       circle

我想选择所有出现的'Red',其中shape == circle。 我已经尝试过groupby但是我在概念上遇到了一些麻烦:

byShape = df.groupby('shape')...

我尝试过count(),但它显示了每个列中每个形状列出的每次总计数。在Pandas中有类似于SQL'where'的东西吗?我想我可能需要用聚合做一些事情,但到目前为止我还没有成功使用它。

编辑:这是我得到的byShape = df.groupby('shape')。count()

                      imageName  color1  color2  color3  color4
shape                                                       
cirle                  3         3       3       3       3
square                 1         1       1       1       1

编辑编辑:我希望得到这样的结果:

 Circle: Red     5
         Blue    6
         Green   1
Square:  Yellow  1
         Blue    1
         Red     1
         White   1  

3 个答案:

答案 0 :(得分:4)

我使用melt来翻转框架,然后使用size

>>> melted = pd.melt(df, id_vars=["imageName", "shape"], value_name="color")
>>> melted.groupby(["shape","color"]).size()
shape   color 
circle  Blue      6
        Green     1
        Red       5
square  Blue      1
        Red       1
        White     1
        Yellow    1
dtype: int64

如果你想要一个框架而不是一个系列,这也很容易:

>>> melted.groupby(["shape","color"]).size().reset_index(name="count")
    shape   color  count
0  circle    Blue      6
1  circle   Green      1
2  circle     Red      5
3  square    Blue      1
4  square     Red      1
5  square   White      1
6  square  Yellow      1

答案 1 :(得分:2)

我使用meltpivot_table

import pandas as pd

df = pd.DataFrame({'color1': {0: 'Red', 1: 'Blue', 2: 'Yellow', 3: 'Blue'}, 'color2': {0: 'Red', 1: 'Green', 2: 'Blue', 3: 'Blue'}, 'color3': {0: 'Red', 1: 'Red', 2: 'Red', 3: 'Blue'}, 'color4': {0: 'Red', 1: 'Blue', 2: 'White', 3: 'Blue'}, 'shape': {0: 'circle', 1: 'circle', 2: ' square', 3: 'circle'}, 'imageName': {0: 'img1', 1: 'img2', 2: 'img3', 3: 'img4'}})
df = df[['shape','color1','color2','color3','color4']]
cheese = pd.melt(df, id_vars=['shape'], value_vars=['color1','color2','color3','color4'])
pvt = pd.pivot_table(cheese, index=['shape', 'value'], aggfunc=len)

print pvt

结果:

                variable
shape   value           
 square Blue           1
        Red            1
        White          1
        Yellow         1
circle  Blue           6
        Green          1
        Red            5

在转动之前,这是cheese

      shape variable   value
0    circle   color1     Red
1    circle   color1    Blue
2    square   color1  Yellow
3    circle   color1    Blue
4    circle   color2     Red
5    circle   color2   Green
6    square   color2    Blue
7    circle   color2    Blue
8    circle   color3     Red
9    circle   color3     Red
10   square   color3     Red
11   circle   color3    Blue
12   circle   color4     Red
13   circle   color4    Blue
14   square   color4   White
15   circle   color4    Blue

答案 2 :(得分:1)

import pandas as pd

df = pd.DataFrame({'imageName':['img1','img2','img3','img4'],                       
                'color1':['Red','Blue','Yellow','Blue'],
                'color2':['Red','Green','Blue','Blue'],
                'color3':['Red','Red','Red','Blue'],
                'color4':['Red','Blue','White','Blue'],
                'shape':['circle','circle','square','circle']})

df.set_index('imageName',inplace=True)

test = df.set_index('shape').stack()
df1 = pd.DataFrame(test.values,test.index.droplevel(1))
df1.columns = ['Color']
df1['value'] = 1
df1.groupby([df1.index,'Color']).sum()

输出:

               value
shape  Color        
circle Blue        6
       Green       1
       Red         5
square Blue        1
       Red         1
       White       1
       Yellow      1