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

标签 python arrays pandas

我有一个数据框,其中包含由 , 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/

相关文章:

javascript - 如何使用GAE仅刷新部分页面

python - 从 Pandas 系列中删除零行

python - 使用 WebTest 对 Bottle 应用程序进行单元测试

php - 有人可以解释这 2 个引用用法在 PHP 中的区别吗?

arrays - 是否可以在 Swift 中将子类型的元组添加到类型的元组数组中?

python - 从 Spark Python 到 Pandas 的时间戳往返

python - 如何从 Pandas 数据框中删除累积对,只保留其中一个

python - 在文件中查找给定单词的字谜

java - 我无法弄清楚这个数组

python - 要指定列名称,为什么 `pd.read_csv` 和 `pd.DataFrame` 使用相同的参数名称?