具有这样的数据帧:
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,我希望获得月份发生的时间请注意,transaction_id只能与一个月相关。
例如,如果transaction_id=4,则月份将为2。
我知道,如果相关的transactions_ids包含给定的transaction_id,可以通过逐月查找来循环完成,但我想知道是否有比这更有效的方法。
干杯
在我看来,最好的方法是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)
,以避免不必要的行为。
您可以使用pandas
字符串方法在"列表";(当使用StringIO
读取时,就pandas
而言,它实际上只是一个字符串(:
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)