嘿,我有一个如图所示的数据框
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中完成上述操作的帮助,将不胜感激:)
预先感谢您的帮助:)
答案 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