我有这样一个数据帧:

| cat0  | cat1 | cat2 | col_list  | Quantity |
| ----- | ---- | ---- | ----------| -------- |
| alpha | x    | a    | [a,b,c,d] | 4        |
| alpha | y    | a    | [e]       | 1        |
| beta  | z    | a    | [f,g]     | 2        |
| gamma | p    | b    | [h]       | 1        |
| gamma | q    | b    | [I,j,k,l] | 4        |
| phi   | r    | c    | [r,s]     | 2        |
| eita  | s    | c    | [m,n]     | 2        |

我想让它基于cat2列进行转换.如果它们具有相同的值,则将这些行合并为1,并按如下方式合并行:

| cat0       | cat1  | cat2 | col_list        | Quantity |
| ---------- | ----- | ---- | ----------------| -------- |
| alpha,beta | x,y,z | a    | [a,b,c,d,e,f,g] | 7        |
| gamma      | p,q   | b    | [h,I,j,k,l]     | 5        |
| phi,eita   | r,s   | c    | [r,s,m,n]       | 4        |

如果列具有字符串值(列:cat0,cat1),则用逗号连接并分隔它们.如果它有列表值("col_list"列),则将这些元素添加到单个列表中.如果是int值(列:Quantity),则只需添加它们.

推荐答案

您可以使用groupby.agglist/','.joinsumitertools.chain:

from itertools import chain

(df
 .groupby('cat2', as_index=False)
 .agg({'cat0': ','.join, 'cat1': ','.join,
       'col_list': lambda x: list(chain.from_iterable(x)),
       'Quantity': 'sum'
       })
 [df.columns] # reindex like original
)

NB. in place or 100, you can also use: 101

输出:

               cat0   cat1 cat2               col_list  Quantity
0  alpha,alpha,beta  x,y,z    a  [a, b, c, d, e, f, g]         7
1       gamma,gamma    p,q    b        [h, I, j, k, l]         5
2          phi,eita    r,s    c           [r, s, m, n]         4

Python相关问答推荐

在Python中是否可以输入使用任意大小参数列表的第一个元素的函数

Pandas数据帧处理Pandas表中Json内的嵌套列表以获取后续Numpy数组

如何才能将每个组比上一组增加N %?

合并同名列,但一列为空,另一列包含值

如何在Python中增量更新DF

是什么导致对Python脚本的jQuery Ajax调用引发500错误?

如何在PIL、Python中对图像应用彩色面膜?

Python中的函数中是否有充分的理由接受float而不接受int?

从DataFrame.apply创建DataFrame

Python会扔掉未使用的表情吗?

pandas DataFrame GroupBy.diff函数的意外输出

Python daskValue错误:无法识别的区块管理器dask -必须是以下之一:[]

Python json.转储包含一些UTF-8字符的二元组,要么失败,要么转换它们.我希望编码字符按原样保留

Python 约束无法解决n皇后之谜

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

基于索引值的Pandas DataFrame条件填充

多处理队列在与Forking http.server一起使用时随机跳过项目

Polars asof在下一个可用日期加入

在单次扫描中创建列表

用SymPy在Python中求解指数函数