按pandas列中的相对位置过滤逗号分隔的字符串



我有一个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                  |

如您所见,列packagesTrialStatus的值只是逗号分隔的字符串。与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假、假、真假,真[/tr>
用户
345A、B、C、D、F
238B、C、F真、假
467A,B

相关内容

  • 没有找到相关文章

最新更新