Проверьте, содержит ли ячейка списка значение

#pandas #dataframe

#pandas #фрейм данных

Вопрос:

Наличие фрейма данных, подобного этому:

   month  transactions_ids 
0     1         [0, 5, 1]        
1     2            [7, 4]    
2     3    [8, 10, 9, 11]     
3     6               [2]                  
4     9               [3]  
  

Для данного transaction_id я хотел бы получить месяц, когда это произошло. Обратите внимание, что идентификатор транзакции_id может быть связан только с одним месяцем.

Так, например, при заданном transaction_id = 4 месяц будет равен 2.

Я знаю, что это можно сделать в цикле, просматривая месяц за месяцем, содержат ли связанные transactions_ids данный transaction_id, но мне интересно, есть ли какой-либо способ более эффективный, чем этот.

Приветствия

Ответ №1:

На мой взгляд, лучший способ explode — использовать ваш фрейм данных и избегать наличия списков python в ваших ячейках.

 df = df.explode('transaction_ids')
  

который выводит

    month transactions_ids
0      1                0
0      1                5
0      1                1
1      2                7
1      2                4
2      3                8
2      3               10
2      3                9
2      3               11
3      6                2
4      9                3
  

Затем просто

 id_to_find = 1 # example
df.loc[df.transactions_ids == id_to_find, 'month']
  

P.S: имейте в виду дублирующиеся индексы, которые explode выводятся. В общем, это лучше делать explode(...).reset_index(drop=True) в большинстве случаев, чтобы избежать нежелательного поведения.

Ответ №2:

Вы можете использовать pandas строковые методы для поиска идентификатора в «списке» (на самом деле это просто строка, насколько pandas это касается чтения при использовании StringIO ):

 import pandas as pd
from io import StringIO 

data = StringIO("""
 month  transactions_ids 
1                [0,5,1]        
2                  [7,4]    
3            [8,10,9,11]     
6                    [2]                  
9                    [3] 
""")

df = pd.read_csv(data, delim_whitespace=True)

df.loc[df['transactions_ids'].str.contains('4'), 'month']
  

В случае, если ваши transactions_ids списки являются реальными, вы можете использовать map для проверки членства:

 df['transactions_ids'].map(lambda x: 3 in x)