如何在同一列上调用多个 str.contains 以取出 pandas 中的数据
How to call multiple str.contains on same column to take out data in pandas
我创建了一个这样的工作示例:
appart = OrderedDict([ ('Description', ['A LOUER F2 GRENOBLE Quartier Île Verte Rue Eugène Delacroix, place Dr Girard, proche tramway B et ligne de bus, 50,60 m² 4 ème étage avec ascenseur.', 'Actuellement libre.Transport : Ligne de bus C6 desservant le centre ville toutes les 10 mintram A arrêt Mc2Le stationnement.', ' Idéalement située: -à deux pas du Tram (Arrêt Gustave RIvet)-à 10 minutes du Centre Ville -supermarché à 2']),
('Loyer', [350, 267, 150]),
('Type', ['Appartement', 'Maison', 'Parking']),
('Surface', [25, 18, 15]) ] )
df1 = pd.DataFrame.from_dict(appart)
df1
这是我的输出:
Description Loyer Type Surface
0 A LOUER F2 GRENOBLE Quartier Île Verte Rue Eug... 350 Appartement 25
1 Actuellement libre.Transport : Ligne de bus C6... 267 Maison 18
2 Idéalement située: -à deux pas du Tram (Arrêt... 150 Parking 15
所以对于这个 DataFrame,我想从每个描述中取出区域并将其添加到一个名为 Quartier
的新列中。例如,如果第一个描述包含 ('victor hugo|centre ville|hyper-centre-ville')
,则在 Quartier
列中添加 'Centre Ville'
,如果第二个描述包含 (''ile verte|Île-verte|ile-verte|la tronche')
,则在 Quartier
中添加 'Île-Verte'
每个区域的列等等。
我使用 df['Description'].apply(callback)
在每一行上执行函数,return 新值将创建新列。
import pandas as pd
import re
appart = {
'Description': [
'A LOUER F2 GRENOBLE Quartier Île Verte Rue Eugène Delacroix, place Dr Girard, proche tramway B et ligne de bus, 50,60 m² 4 ème étage avec ascenseur.',
'Actuellement libre.Transport : Ligne de bus C6 desservant le centre ville toutes les 10 mintram A arrêt Mc2Le stationnement.',
' Idéalement située: -à deux pas du Tram (Arrêt Gustave RIvet)-à 10 minutes du Centre Ville -supermarché à 2'
],
'Loyer': [350, 267, 150],
'Type': ['Appartement', 'Maison', 'Parking'],
'Surface': [25, 18, 15]
}
df = pd.DataFrame(appart)
print(df)
# ----
def callback(text):
if re.search('Victor Hugo|victor hugo|Centre-ville|centre ville|hyper-centre-ville|gare|grenette|saint André', text, re.IGNORECASE):
return 'Centre-ville'
if re.search('ile verte|Île-verte|ile-verte|la tronche|trois tours|île verte', text, re.IGNORECASE):
return 'Île-Verte'
return ''
df['Quartier'] = df['Description'].apply(callback)
print(df)
编辑: 我认为你可以将第一个 np.where()
嵌套在第二个 np.where()
中作为第三个参数。
np.where( ..., ..., np.where())
但我知道它是否给出了正确的结果。
df['Quartier_2'] = np.where(df['Description'].str.contains('Victor Hugo|victor hugo|\
Centre-ville|centre ville|hyper-centre-ville|gare|grenette|\
saint André', case=False, na=True), 'Centre-ville',
np.where(df['Description'].str.contains('ile verte|Île-verte|ile-verte|la tronche|trois tours|île verte', case=False, na=True), 'Île-Verte', ''))
print(df)
我将 apply()
用于一列,但您可以将它用于多列或完整数据框,然后您必须使用 axis=1
来获取行而不是列。在函数内部,您可以从不同的列中获取值。
def callback(row):
text = row['Description']
if re.search('Victor Hugo|victor hugo|Centre-ville|centre ville|hyper-centre-ville|gare|grenette|saint André', text, re.IGNORECASE):
return 'Centre-ville'
if re.search('ile verte|Île-verte|ile-verte|la tronche|trois tours|île verte', text, re.IGNORECASE):
return 'Île-Verte'
return ''
df['Quartier'] = df.apply(callback, axis=1)
我创建了一个这样的工作示例:
appart = OrderedDict([ ('Description', ['A LOUER F2 GRENOBLE Quartier Île Verte Rue Eugène Delacroix, place Dr Girard, proche tramway B et ligne de bus, 50,60 m² 4 ème étage avec ascenseur.', 'Actuellement libre.Transport : Ligne de bus C6 desservant le centre ville toutes les 10 mintram A arrêt Mc2Le stationnement.', ' Idéalement située: -à deux pas du Tram (Arrêt Gustave RIvet)-à 10 minutes du Centre Ville -supermarché à 2']),
('Loyer', [350, 267, 150]),
('Type', ['Appartement', 'Maison', 'Parking']),
('Surface', [25, 18, 15]) ] )
df1 = pd.DataFrame.from_dict(appart)
df1
这是我的输出:
Description Loyer Type Surface
0 A LOUER F2 GRENOBLE Quartier Île Verte Rue Eug... 350 Appartement 25
1 Actuellement libre.Transport : Ligne de bus C6... 267 Maison 18
2 Idéalement située: -à deux pas du Tram (Arrêt... 150 Parking 15
所以对于这个 DataFrame,我想从每个描述中取出区域并将其添加到一个名为 Quartier
的新列中。例如,如果第一个描述包含 ('victor hugo|centre ville|hyper-centre-ville')
,则在 Quartier
列中添加 'Centre Ville'
,如果第二个描述包含 (''ile verte|Île-verte|ile-verte|la tronche')
,则在 Quartier
中添加 'Île-Verte'
每个区域的列等等。
我使用 df['Description'].apply(callback)
在每一行上执行函数,return 新值将创建新列。
import pandas as pd
import re
appart = {
'Description': [
'A LOUER F2 GRENOBLE Quartier Île Verte Rue Eugène Delacroix, place Dr Girard, proche tramway B et ligne de bus, 50,60 m² 4 ème étage avec ascenseur.',
'Actuellement libre.Transport : Ligne de bus C6 desservant le centre ville toutes les 10 mintram A arrêt Mc2Le stationnement.',
' Idéalement située: -à deux pas du Tram (Arrêt Gustave RIvet)-à 10 minutes du Centre Ville -supermarché à 2'
],
'Loyer': [350, 267, 150],
'Type': ['Appartement', 'Maison', 'Parking'],
'Surface': [25, 18, 15]
}
df = pd.DataFrame(appart)
print(df)
# ----
def callback(text):
if re.search('Victor Hugo|victor hugo|Centre-ville|centre ville|hyper-centre-ville|gare|grenette|saint André', text, re.IGNORECASE):
return 'Centre-ville'
if re.search('ile verte|Île-verte|ile-verte|la tronche|trois tours|île verte', text, re.IGNORECASE):
return 'Île-Verte'
return ''
df['Quartier'] = df['Description'].apply(callback)
print(df)
编辑: 我认为你可以将第一个 np.where()
嵌套在第二个 np.where()
中作为第三个参数。
np.where( ..., ..., np.where())
但我知道它是否给出了正确的结果。
df['Quartier_2'] = np.where(df['Description'].str.contains('Victor Hugo|victor hugo|\
Centre-ville|centre ville|hyper-centre-ville|gare|grenette|\
saint André', case=False, na=True), 'Centre-ville',
np.where(df['Description'].str.contains('ile verte|Île-verte|ile-verte|la tronche|trois tours|île verte', case=False, na=True), 'Île-Verte', ''))
print(df)
我将 apply()
用于一列,但您可以将它用于多列或完整数据框,然后您必须使用 axis=1
来获取行而不是列。在函数内部,您可以从不同的列中获取值。
def callback(row):
text = row['Description']
if re.search('Victor Hugo|victor hugo|Centre-ville|centre ville|hyper-centre-ville|gare|grenette|saint André', text, re.IGNORECASE):
return 'Centre-ville'
if re.search('ile verte|Île-verte|ile-verte|la tronche|trois tours|île verte', text, re.IGNORECASE):
return 'Île-Verte'
return ''
df['Quartier'] = df.apply(callback, axis=1)