检查列表单元格是否包含值



具有这样的数据帧:

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)

最新更新