使用 pandas 查找列表列表中的所有匹配组

2023-12-28

我想找到 Pandas DataFrame 中所有 id 的所有情况。 什么是有效的解决方案?我有大约 10k 条记录,它是在服务器端处理的。创建一个新的 DataFrame 是个好主意,还是可以使用更有效的数据结构?当 id 包含案例中的所有名称时,即满足案例。

输入(Pandas 数据框)

id | name |
-----------
1  | bla1 |
2  | bla2 |
2  | bla3 |
2  | bla4 |
3  | bla5 |
4  | bla9 |
5  | bla6 |
5  | bla7 |
6  | bla8 |

Cases

names [
  [bla2, bla3, bla4], #case 1
  [bla1, bla3, bla7], #case 2
  [bla3, bla1, bla6], #case 3
  [bla6, bla7] #case 4
]

需要的输出(除非有更有效的方法)

id | case1 | case2 | case3 | case4 |
------------------------------------
1  | 0     | 0     | 0     | 0     |
2  | 1     | 0     | 0     | 0     |
3  | 0     | 0     | 0     | 0     |
4  | 0     | 0     | 0     | 0     |
5  | 0     | 0     | 0     | 1     |
6  | 0     | 0     | 0     | 0     |

names = [
   ['bla2', 'bla3', 'bla4'], # case 1
   ['bla1', 'bla3', 'bla7'], # case 2
   ['bla3', 'bla1', 'bla6'], # case 3
   ['bla6', 'bla7']          # case 4
]

df = df.groupby('id').apply(lambda x: \
                pd.Series([int(pd.Series(y).isin(x['name']).all()) for y in names]))\
       .rename(columns=lambda x: 'case{}'.format(x + 1))

df
+------+---------+---------+---------+---------+
|   id |   case1 |   case2 |   case3 |   case4 |
|------+---------+---------+---------+---------|
|    1 |       0 |       0 |       0 |       0 |
|    2 |       1 |       0 |       0 |       0 |
|    3 |       0 |       0 |       0 |       0 |
|    5 |       0 |       0 |       0 |       1 |
|    6 |       0 |       0 |       0 |       0 |
+------+---------+---------+---------+---------+

First, groupby id,然后对每个组的每个案例依次应用检查。目的是检查组中的所有项目是否与给定案例匹配。这是由isin与列表理解结合起来。外层pd.Series将结果扩展到单独的列并且df.rename用于重命名列。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 pandas 查找列表列表中的所有匹配组 的相关文章

随机推荐