根据标准计算出现次数
Counting occurrences based on criterion
我正在尝试计算一种颜色在数据框中出现的总次数,但我只希望它 select 它们符合 selected 标准。
例如我有:
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
我想要 select 所有出现的 'Red' where 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
EDIT EDIT:我希望得到这样的最终输出:
Circle: Red 5
Blue 6
Green 1
Square: Yellow 1
Blue 1
Red 1
White 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
我会用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
我使用 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
我正在尝试计算一种颜色在数据框中出现的总次数,但我只希望它 select 它们符合 selected 标准。 例如我有:
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
我想要 select 所有出现的 'Red' where 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
EDIT EDIT:我希望得到这样的最终输出:
Circle: Red 5
Blue 6
Green 1
Square: Yellow 1
Blue 1
Red 1
White 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
我会用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
我使用 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