【发布时间】:2020-10-05 14:59:37
【问题描述】:
考虑这个例子:
>>> import pandas as pd
>>> df = pd.DataFrame(
... [
... ['X', 'R', 1],
... ['X', 'G', 2],
... ['X', 'R', 1],
... ['X', 'B', 3],
... ['X', 'R', 2],
... ['X', 'B', 2],
... ['X', 'G', 1],
... ],
... columns=['client', 'status', 'cnt']
... )
>>> df
client status cnt
0 X R 1
1 X G 2
2 X R 1
3 X B 3
4 X R 2
5 X B 2
6 X G 1
>>>
>>> df_gb = df.groupby(['client', 'status']).cnt.sum().unstack()
>>> df_gb
status B G R
client
X 5 3 4
>>>
>>> def color(row):
... if 'R' in row:
... red = row['R']
... else:
... red = 0
... if 'B' in row:
... blue = row['B']
... else:
... blue = 0
... if 'G' in row:
... green = row['G']
... else:
... green = 0
... if red > 0:
... return 'red'
... elif blue > 0 and (red + green) == 0:
... return 'blue'
... elif green > 0 and (red + blue) == 0:
... return 'green'
... else:
... return 'orange'
...
>>> df_gb.apply(color, axis=1)
client
X red
dtype: object
>>>
此代码的作用是 groupby 以获取每个类别(红色、绿色、蓝色)的计数。 比 apply 用于实现确定每个客户端颜色的逻辑(在这种情况下只有一个)。
这里的问题实际上是 groupby 对象可以包含任何 RGB 值的组合。 例如,我可以有 R 和 G 列但没有 B,或者我可以只有 R 列,或者我不会有任何 RGB 列。
由于这个事实,在 apply 函数中,我必须为每一列引入 if 语句,以便对每种颜色进行计数,无论其值是否在 groupby 对象中。
我是否有任何其他选择来强制执行颜色函数的逻辑,使用其他东西而不是以这种(丑陋的)方式应用?
例如,在这种情况下,我提前知道我需要恰好三个类别的计数 - R、G 和 B。我需要按列分组和这三个值之类的东西。
我可以按这三个类别(系列、字典、函数吗?)对数据框进行分组,并且无论它们是否存在于组中,所有三个类别总是得到零或总和?
【问题讨论】:
-
您能否举例说明您的分组数据框不包含任何
RGB值或根本不包含任何值的情况?
标签: python-3.x pandas group-by pandas-groupby apply