python - 如何按数据框的值进行分组?

标签 python pandas group-by pivot-table

我有这 2 个 df,它们基本相同,但在 df1 中,值是相应客户的付款金额,另一个是该期间的客户状态(第 1、2、3、4 列是期):

df1:

customer|1|2|3|4
x       |2|5|5|5
y       | |5|5|5
z       |5|5|5|

df2:

customer|1|2|3|4
x       |N|E|E|E
y       | |N|E|E
z       |N|E|C|-

我想按 df2 的值的状态进行分组,如下所示:

Status  1 |2 |3 |4
N        7|5 |  |
E         |10|10|10
C         |  |5 |

我曾经使用以下方法对状态计数进行分组

df2.apply(pd.value_counts).fillna(0)

但现在,而不是 count值,我想要SUM相应数据帧的值 DF1

最佳答案

通常,这看起来很困难,因为你的 DataFrame 的形状很奇怪。如果你先melt他们,这变得很容易:只需 merge他们,groupby您感兴趣的数量并对它们求和(如果您想以该格式显示它,则再次 pivot ):

df1m = df1.melt(id_vars='customer', var_name='period', value_name='amount')
df2m = df2.melt(id_vars='customer', var_name='period', value_name='status')
dfm = df1m.merge(df2m)
res = dfm.groupby(['status', 'period'])['amount'].sum().reset_index()
res.pivot_table(index='status', columns='period')

#period      1     2     3     4
#status                         
#C         NaN   NaN   5.0   NaN
#E         NaN  10.0  10.0  10.0
#N         7.0   5.0   NaN   NaN

为了展示熔化的作用:它对数据帧进行逆透视,因此每个观察(客户、期间)都有一行具有金额/状态

df1m
#    customer period  amount
#0   x             1     2.0
#1   y             1     NaN
#2   z             1     5.0
#3   x             2     5.0
#4   y             2     5.0
#5   z             2     5.0
#6   x             3     5.0
#7   y             3     5.0
#8   z             3     5.0
#9   x             4     5.0
#10  y             4     5.0
11  z             4     NaN

关于python - 如何按数据框的值进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55421609/

相关文章:

MySQL Order By 和 Group By 问题

MySQL-如何按组求和计数

php - 将 2 个相似的分组 MySql 查询(同一个表)组合在一个并循环中以有效的方式获取数组

python - numpy读取txt错误(loadtxt,genfromtxt)

python - matplotlib set_label_position 在 3d 中没有效果?

python - 使用 SSL 从 HTTPS 读取文件到 pandas 数据帧

python - 将 Pandas Dataframe 日期索引和列转换为 Numpy 数组

python - 使用 Python 和 Pandas 在具有不同列名的 statsmodels.formula 数据上使用 predict()

Python子进程通信,顶部显示CPU使用率低

python - 在 matplotlib 中绘制共享 x 轴的两个图