gpt4 book ai didi

python - 循环遍历多个数组并连接 pandas 中的值

转载 作者:行者123 更新时间:2023-12-02 06:31:16 27 4
gpt4 key购买 nike

我有一个数据框,其中包含由 , commas 分隔的项目列表,如下所示。

+----------------------+
| Items |
+----------------------+
| X1,Y1,Z1 |
| X2,Z3 |
| X3 |
| X1,X2 |
| Y2,Y4,Z2,Y5,Z3 |
| X2,X3,Y1,Y2,Z2,Z4,X1 |
+----------------------+

此外,我还有 3 个数组列表,其中上面提到的所有项目都被分组到特定组中,如下所示

X = [X1,X2,X3,X4,X5]
Y = [Y1,Y2,Y3,Y4,Y5]
Z = [Z1,Z2,Z3,Z4,Z5]

我的任务是拆分数据框中的每个值并检查 3 个数组中的各个项目,如果某个项目位于任何数组中,则它应该连接找到的组的名称,并用 & 分隔。此外,如果许多项目位于同一组/数组中,那么它也应该提及出现的次数。

我想要的输出如下。引用Category

+----------------------+--------------+
| Items | Category |
+----------------------+--------------+
| X1,Y1,Z1 | X & Y & Z |
| X2,Z3 | X & Z |
| X3 | X |
| X1,X2 | 2X |
| Y2,Y4,Z2,Y5,Z3 | 3Y & 2Z |
| X2,X3,Y1,Y2,Z2,Z4,X1 | 3X & 2Y & 2Z |
+----------------------+--------------+

X、Y 和 Z 是数组的名称。我该如何开始使用 pandas 来解决这个问题?请指导。

最佳答案

假设一列列表分解列表,那么这是一个简单的isin检查,我们沿着原始索引求和。我建议使用不同的输出,它可以获取相同的信息,但将来更容易使用。

示例

import pandas as pd

df = pd.DataFrame({'Items': [['X1', 'Y1', 'Z1'], ['X2', 'Z3'], ['X3'],
['X1', 'X2'], ['Y2', 'Y4', 'Z2', 'Y5', 'Z3'],
['X2', 'X3', 'Y1', 'Y2', 'Z2', 'Z4', 'X1']]})
X = ['X1','X2','X3','X4','X5']
Y = ['Y1','Y2','Y3','Y4','Y5']
Z = ['Z1','Z2','Z3','Z4','Z5']
<小时/>
s = df.explode('Items')['Items']
pd.concat([s.isin(l).sum(level=0).rename(name)
for name, l in [('X', X), ('Y', Y), ('Z', Z)]], axis=1).astype(int)
# X Y Z
#0 1 1 1
#1 1 0 1
#2 1 0 0
#3 2 0 0
#4 0 3 2
#5 3 2 2
<小时/>

要获得输出,请屏蔽 0 并在值后面添加列名称。然后我们进行字符串连接以获得结果。在这里,我使用 apply 来简化、对齐和 NaN 处理,但还有其他稍微更快的替代方案。

res = pd.concat([s.isin(l).sum(level=0).rename(name) 
for name, l in [('X', X), ('Y', Y), ('Z', Z)]], axis=1).astype(int)

res = res.astype(str).replace('1', '').where(res.ne(0))
res = res.add(res.columns, axis=1)

# Aligns on index due to `.sum(level=0)`
df['Category'] = res.apply(lambda x: ' & '.join(x.dropna()), axis=1)
# Items Category
#0 [X1, Y1, Z1] X & Y & Z
#1 [X2, Z3] X & Z
#2 [X3] X
#3 [X1, X2] 2X
#4 [Y2, Y4, Z2, Y5, Z3] 3Y & 2Z
#5 [X2, X3, Y1, Y2, Z2, Z4, X1] 3X & 2Y & 2Z

关于python - 循环遍历多个数组并连接 pandas 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59635147/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com