簡體   English   中英

Python & Pandas:如何查詢列表類型的列是否包含某些內容?

[英]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.containssetapplyin 盡管使用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)

str.包含

%%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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM