python pandas按列表中现有行的一部分进行过滤

时间:2019-02-13 15:52:46

标签: python pandas

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

编辑:与熊猫一起获得这种结果要比全面获取列表中的值更有效?

3 个答案:

答案 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