簡體   English   中英

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

[英]Find all matching groups in a list of lists with pandas

我想在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     |
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用於重命名列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM