2017-12-13 5 views
-2

는이 같은 작업 예제 작성 :

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')이 포함 된 경우 열에 을 추가하고 두 번째 설명에 (''ile verte|Île-verte|ile-verte|la tronche')이 포함 된 경우 Quartier 열에 'Île-Verte' 등을 추가합니다.

+1

설명이 텍스트가 아닌 이미지로 표시되거나 최소한의 작업 예제만으로 모든 사람이 실행할 수 있고 변경 될 수 있습니다. – furas

+0

'df [ 'Description']. apply (callback)'을 사용하고 모든 코드를'callback' 함수에 넣을 수 없습니까? – furas

+0

나는 편집했습니다. thnx @furas –

답변

0

모든 행에 함수를 실행하고 새 열을 생성하는 새 값을 반환하려면 df['Description'].apply(callback)을 사용합니다.

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()를 사용하지만 당신은 많은 열 또는 전체 dataframe로 사용할 수 있습니다 그리고 당신은 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) 
+0

이것은 완벽하게 작동합니다. @furas에 감사드립니다. df [ 'Quartier_2'] = np.where (df [ '설명'] str.contains ('Victor Hugo | 빅터 휴고 | \ 센터 빌 | 센터 ​​빌 | 하이퍼 센터 빌 | grenette | \ 성자 André ', 경우 = False, na = True),'Center-ville ', np.where (df ['설명 '] str.contains ('ile verte | Île-verte | ile-verte 'np.where'에 대해 –

+0

인쇄 (df)'OK '가 아니라면'012 '' '' '' '' '' '' '' '') 더 많은'np.where'에 대해 그것은 지저분해질 것입니다. – furas

+1

3 개의''np.where''에 대해 이미 시도했지만 잘 작동합니다;) –