我有这个数据帧:
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
编辑:用熊猫观察这个结果会比在列表中获得全面的值更有效?
您可以使用基于匹配的布尔掩码:
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
这可以使用提取来完成
print(df.loc[~df.A.str.extract(r'([^|]+)').isin(items)[0]].reset_index(drop=True))
输出:
A
0 data2|context2
1 data4|context4