如何将多个 DataFrame 行合并为 1 行,其中包含列表值

How to combine multiple DataFrame rows into 1 with a column containing list values

提问人:trojan horse 提问时间:7/21/2022 更新时间:7/21/2022 访问量:97

问:

我有一个这样的 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),则只需添加它们即可。

Python Pandas 列表 帧数据 操作

评论


答:

2赞 mozway 7/21/2022 #1

您可以将 groupby.agg、 和 /、 或 itertools.chain 一起使用:list','.joinsum

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
当然,你可以用代替','.joinlist
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']