我正在尝试计算颜色在数据框中显示的总次数,但我只希望它根据所选条件选择它们。 例如,我有:
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
答案 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)
我使用melt
和pivot_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