我有一个像这样的 DataFrame:
| 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.agg
, 与 list
/','.join
, sum
, 或 itertools.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
)
注意。 in place 或 chain
,您还可以使用:lambda x: [v for l in x for x in l]
输出:
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 - 如何使用包含列表值的列将多个 DataFrame 行合并为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73062256/