我有这个DataFrame:
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
编辑:与熊猫一起获得这种结果要比全面获取列表中的值更有效?
答案 0 :(得分:1)
您可以使用基于match的布尔掩码:
dependencies {
implementation 'com.google.android.gms:play-services-ads:17.1.2'
//noinspection GradleCompatible
implementation 'com.android.support:appcompat-v7:28.0.0'
}
输出
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'
答案 1 :(得分:0)
使用
df.loc[df['A'].str.split('|').apply(lambda x: x[0] not in items )]
输出
A
1 data2|context2
3 data4|context4
答案 2 :(得分:0)
可以使用extract
print(df.loc[~df.A.str.extract(r'([^|]+)').isin(items)[0]].reset_index(drop=True))
输出:
A
0 data2|context2
1 data4|context4