python按lis中存在的部分行进行筛选

2024-06-28 14:41:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个数据帧:

df = pandas.DataFrame({'A' : [data1|context1, data2|context2, data3|context3, data4|context4]})

结果:

   A
0  data1|context1
1  data2|context2
2  data3|context3
3  data4|context4

我还有这个清单:

items = ['data1', 'data3']

我要获取数据帧行,这些行在列表中没有|的左边部分。如何仅按每行的左边部分过滤?我只知道如何按整行过滤,但不知道按部分过滤。你知道吗

结果应该是:

   A
0  data2|context2
1  data4|context4

编辑:用pandas获得这个结果比在列表中获得值更有效?你知道吗


Tags: 数据编辑dataframepandasdf列表itemsdata1
3条回答

可以使用基于match的布尔掩码:

import pandas as pd

items = ['data1', 'data3']
df = pd.DataFrame({'A': ['data1|context1', 'data2|context2', 'data3|context3', 'data4|context4']})

mask = df.A.str.match('^(?!{})'.format('|'.join(items)))
result = df[mask]

print(result)

输出

                A
1  data2|context2
3  data4|context4

语句'^(?!{})'.format('|'.join(items))变为^(?!data1|data3),这意味着既不以'data1'开始,也不以'data3'开始。如果您喜欢一行,您可以:

result = df.loc[df.A.str.match('^(?!{})'.format('|'.join(items)))]

使用

df.loc[df['A'].str.split('|').apply(lambda x: x[0] not in items )]

输出

                A
1  data2|context2
3  data4|context4

这可以使用extract实现

print(df.loc[~df.A.str.extract(r'([^|]+)').isin(items)[0]].reset_index(drop=True))

输出:

                A
0  data2|context2
1  data4|context4

相关问题 更多 >