[英]Python & Pandas: How to query if a list-type column contains something?
我有一個數據框,其中包含有關電影的信息。 它有一個名為genre
的列,其中包含它所屬的流派列表。 例如:
df['genre']
## returns
0 ['comedy', 'sci-fi']
1 ['action', 'romance', 'comedy']
2 ['documentary']
3 ['crime','horror']
...
我想知道如何查詢數據框,以便它返回電影屬於某種類型?
例如, df['genre'].contains('comedy')
可能會返回 0 或 1。
我知道一個列表,我可以做這樣的事情:
'comedy' in ['comedy', 'sci-fi']
但是,在 pandas 中,我沒有找到類似的東西,我唯一知道的是df['genre'].str.contains()
,但它不適用於列表類型。
您可以使用apply
來創建mask
,然后使用boolean indexing
:
mask = df.genre.apply(lambda x: 'comedy' in x)
df1 = df[mask]
print (df1)
genre
0 [comedy, sci-fi]
1 [action, romance, comedy]
使用集合
df.genre.map(set(['comedy']).issubset)
0 True
1 True
2 False
3 False
dtype: bool
df.genre[df.genre.map(set(['comedy']).issubset)]
0 [comedy, sci-fi]
1 [action, romance, comedy]
dtype: object
以我更喜歡的方式呈現
comedy = set(['comedy'])
iscomedy = comedy.issubset
df[df.genre.map(iscomedy)]
更高效
comedy = set(['comedy'])
iscomedy = comedy.issubset
df[[iscomedy(l) for l in df.genre.values.tolist()]]
在兩遍中使用str
減緩! 而且不完全准確!
df[df.genre.str.join(' ').str.contains('comedy')]
根據源代碼,您可以使用.str.contains(..., regex=False)
。
您需要設置regex=False
並且.str.contains
將適用於您所期望的列表值:
In : df['genre'].str.contains('comedy', regex=False)
Out:
0 True
1 True
2 False
3 False
Name: genre, dtype: bool
一個完整的例子:
import pandas as pd
data = pd.DataFrame([[['foo', 'bar']],
[['bar', 'baz']]], columns=['list_column'])
print(data)
list_column
0 [foo, bar]
1 [bar, baz]
filtered_data = data.loc[
lambda df: df.list_column.apply(
lambda l: 'foo' in l
)
]
print(filtered_data)
list_column
0 [foo, bar]
這可以按照建議的所有三種方式完成,使用str.contains
、 set
或apply
和in
。 盡管使用set
是實現這一目標的最有效方法。
這是在具有 10,000 行的外推數據幀上的三種方法的性能比較:
%%timeit -n 500 -r 35
df[df.genre.map(set(['comedy']).issubset)]
2.23 ms ± 154 µs per loop (mean ± std. dev. of 35 runs, 500 loops each)
%%timeit -n 500 -r 35
df[df.genre.apply(lambda x: 'comedy' in x)]
2.36 ms ± 359 µs per loop (mean ± std. dev. of 35 runs, 500 loops each)
%%timeit -n 500 -r 35
df[df['genre'].str.contains('comedy', regex=False)]
2.83 ms ± 299 µs per loop (mean ± std. dev. of 35 runs, 500 loops each)
您好這可以使用dataframe
框的isin
方法來完成。
df1[df1.name.isin(['Rohit','Rahul'])]
這里df1
是一個dataframe
對象, name
是一個字符串系列
>>> df1[df1.name.isin(['Rohit','Rahul'])]
sample1 name Marks Class
0 1 Rohit 34 10
1 2 Rahul 56 12
>>> type (df1)
<class 'pandas.core.frame.DataFrame>
>>> df1.head()
sample1 name Marks Class
0 1 Rohit 34 10
1 2 Rahul 56 12
2 3 ankit 78 11
3 4 sajan 98 10
4 5 chintu 76 9
一個使用布爾索引和列表理解的班輪:
searchTerm = 'something'
df[[searchTerm in x for x in df['arrayColumn']]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.