如何保留具有特定值的数据框中的列表列?

时间:2019-11-01 02:21:43

标签: python pandas

嘿,我有一个如图所示的数据框

id     A      B
1      2     ['a', 'c', 'd']
3      4     ['s', 'z', 'a', 'e']
5      6     ['b', 'z', 'd']
7      8     ['a', 'g']

现在,我想提取“ B”列中所有具有“ a”的行 所需的输出:

id     A      B
1      2     ['a', 'c', 'd']
3      4     ['s', 'z', 'a', 'e']
7      8     ['a', 'g']

有关使用Pandas在python中完成上述操作的帮助,将不胜感激:)

预先感谢您的帮助:)

3 个答案:

答案 0 :(得分:1)

我们可以做到

df[pd.DataFrame(df.B.tolist()).eq('a').any(1).values]

答案 1 :(得分:1)

使用Series.apply来执行boolean indexing

new_df=df[df['B'].apply(lambda x: 'a' in x)]
print(new_df)

   id  A             B
0   1  2     [a, c, d]
1   3  4  [s, z, a, e]
3   7  8        [a, g]

详细信息:

df['B'].apply(lambda x: 'a'  in x)
0     True
1     True
2    False
3     True
Name: B, dtype: bool

您还可以使用callable

df.loc[lambda x: x.B.str.join(',').str.contains('a')]

400行的时间测量

%%timeit
df[pd.DataFrame(df.B.tolist()).eq('a').any(1).values]
3.72 ms ± 105 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit
df.loc[lambda x: x.B.str.join(',').str.contains('a')]
1.33 ms ± 90.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit
df[df['B'].apply(lambda x: 'a' in x)]
786 µs ± 9.62 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

答案 2 :(得分:1)

您可以这样做:

new_df = pd.DataFrame(columns = ["id", "A", "B"])

i=0
for index, row in df.iterrows():
    if "a" in row['B']:
        new_df.loc[i] = row
        i+=1