提问人:trojan horse 提问时间:7/21/2022 更新时间:7/21/2022 访问量:97
如何将多个 DataFrame 行合并为 1 行,其中包含列表值
How to combine multiple DataFrame rows into 1 with a column containing list values
问:
我有一个这样的 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 |
如果列有字符串值(column:cat0,cat1),请连接并用逗号分隔它们。如果它有列表值(column“ col_list),则将这些元素添加到单个列表中。如果它是 int 值(column: Quantity),则只需添加它们即可。
答:
2赞
mozway
7/21/2022
#1
您可以将 groupby.agg
、 和 /、 或 itertools.chain
一起使用:list
','.join
sum
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
)
铌。在 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
评论
0赞
trojan horse
7/21/2022
谢谢@mozway。我只使用 groupby.agg,但无法获得正确的规则集。我需要学会更好地使用它。非常方便。唯一的问题是 - 我不能避免 cat0 和 cat1 被列出吗?并将它们作为字符串用逗号分隔
0赞
trojan horse
7/21/2022
我尝试放置 str 而不是 list,但后来我得到了一个额外的 \n,其中包含一些 int 值,这些值是这些行的索引
0赞
mozway
7/21/2022
当然,你可以用代替','.join
list
2赞
I'mahdi
7/21/2022
#2
您可以在 pandas.groupby
之后使用 agg
,并使用 functools.reduce
来合并多个列表和将字符串与逗号合并。','.join
>>> from functools import reduce
>>> df.groupby('cat2').agg({'cat0': ','.join,
'cat1': ','.join,
'col_list' : lambda x: reduce(lambda y,z : y+z, x),
'Quantity' : 'sum'})
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
说明:(如何减少合并多个列表?
>>> reduce(lambda y,z : y+z, [['a','b','c','d'], ['e'], ['f','g']])
# y <- (['a','b','c','d'] + ['e'])
# y + ['f','g']
['a', 'b', 'c', 'd', 'e', 'f', 'g']
评论