我有一个pandas数据帧,它逐行显示用户激活的包,以及他们是否使用真/假逻辑试用该包。:
| User | Packages | TrialStatus |
|------|-----------|-----------------------------|
| 345 | A,B,C,D,F | False,False,False,True,True |
| 238 | B,C,F | True,False,False |
| 467 | A,B | False,True |
如您所见,列packages
和TrialStatus
的值只是逗号分隔的字符串。与packages
列中的包位置相对应的TrialStatus
中的真/假值的位置。
我想要的是一种简单的方法,可以在packages
列中搜索特定程序包(例如B
(,在TrialStatus
列中查找程序包B
的试用状态,并根据位置查看它是否为True,然后返回原始数据帧,其中包含一个仅具有程序包B试用状态的新列。这应该返回:
| User | Packages | TrialStatus | PackageB_TrialStatus |
|------|-----------|-----------------------------|----------------------|
| 345 | A,B,C,D,F | False,False,False,True,True | False |
| 238 | B,C,F | True,False,False | True |
| 467 | A,B | False,True | True |
我的第一个想法是结合通常的列表理解方法来创建panda条件列:
df['cond_column'] = ['true' if x == 'true_value' else 'false' for x in df['other_column']]
并将其与一些正则表达式相结合,也许是为了位置方面,但不确定这是否可行。有人能帮忙吗?如果需要更多解释,请告诉我
您可以创建一个具有分解值的辅助数据帧,然后使用它来过滤您的数据和具有原始数据帧的merge
:
df2 = (df.assign(Packages=df['Packages'].str.split(','),
TrialStatus=df['TrialStatus'].str.split(',')
)
# multi-column explode requires pandas ≥ 1.3.0
# if older use .apply(pd.Series.explode)
.explode(column=['Packages', 'TrialStatus'])
)
# .eq('B') # is also valid
df.merge(df2.loc[df2['Packages'].isin(['B']), ['User', 'TrialStatus']],
on='User', suffixes=('', '_B')
)
拥有辅助数据帧将使您能够有效地搜索其他可能性,而不是每次需要执行此操作时都重复split
过程。
输出:
User Packages TrialStatus TrialStatus_B
0 345 A,B,C,D,F False,False,False,True,True False
1 238 B,C,F True,False,False True
2 467 A,B False,True True
通过使用apply并将字符串转换为列表。不需要正则表达式。
data = {"User": [345, 238, 467], "Packages": ["A,B,C,D,F", "B,C,F", "A,B"],
"TrialStatus":["False,False,False,True,True", "True,False,False", "False,True"]}
df = pd.DataFrame(data)
Df
用户 | 包 | TrialStatus|
---|---|---|
345 | A、B、C、D、F | 假、假、真|
238 | B、C、F | 真、假 |
467 | A,B | 假,真[/tr>