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

时间:2017-09-18 08:35:44

标签: python pandas search dataframe

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

输入(Pandas DataFrame)

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

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     |

1 个答案:

答案 0 :(得分:2)

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 |
+------+---------+---------+---------+---------+

首先,groupby id,然后对每个案例依次对每个案例进行一次检查。目标是检查组中的所有项目是否与给定案例匹配。这由isin和列表推导一起处理。外部pd.Series会将结果展开为单独的列,df.rename用于重命名列。