#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)