2016-12-12 1 views
1

나는 2 dataframe을하고 난 두 번째 FIrse DF 값을 사용하여, 첫째 dataframe에 새 열을 얻을 수팬더는 : 사용 열의 값을 대체 정규식

ID,"url","used_at","active_seconds" 
8075643aab791cec7dc9d18926958b67,"sberbank.ru/ru/person/promo/10mnl?utm_source=Vesti.ru&utm_medium=html&utm_campaign=10_million_users_SBOL_dec2015&utm_term=every14_syncbanners",2016-01-01 00:03:16,183 
a04a8041ffa6fe1b85471ca5af1ee575,"online.rsb.ru/hb/faces/system/login/rslogin.jsp?credit=false",2016-01-01 00:04:36,42 
a04a8041ffa6fe1b85471ca5af1ee575,"online.rsb.ru/hb/faces/system/login/sms/sms.jsp?smsAuth=true",2016-01-01 00:05:18,22 
a04a8041ffa6fe1b85471ca5af1ee575,"online.rsb.ru/hb/faces/rs/RSIndex.jspx",2016-01-01 00:05:40,14 
a04a8041ffa6fe1b85471ca5af1ee575,"online.rsb.ru/hb/faces/rs/payments/PaymentReq.jspx",2016-01-01 00:05:54,22 
ba880911a6d54f6ea6d3145081a0e0dd,"homecredit.ru/help/quest/feedback.php",2016-01-01 00:06:12,2 

둘째 DF가

URL Code 
citibank\.ru\/russia\/info\/rus\/contacts_form\.htm 15 
citibank\.ru\/russia\/info\/rus\/contacts\.htm 15 
gazprombank\.ru\/contacts\/ 15 
gazprombank\.ru\/feedback\/ 15 
gazprombank\.ru\/additional_office\/ 15 
homecredit\.ru\/help\/quest\/feedback\.php 15 
homecredit\.ru\/offices\/* 15 
처럼 보이는이 필요 내가 정규식이없는 경우

, 나는

df1['code'] = df1.url.map(df2.set_index('URL')['Code']) 

를 사용하지만 0,123,408 때문에,이 작업을 수행 할 수 없습니다은 정규식입니다. 하지만

df1['code'] = df1['url'].replace(df2['URL'], df2['Code'], regex=True) 

이 작동하지 않습니다.

+0

무슨 에러가 발생합니까? – IanS

+1

'pandas.Series.replace()'를 보면 시리즈 객체가'to_replace'와'value' 인자로 넘겨 질 때 메소드가 제대로 작동 할 것으로 확신 할 수 없습니다. 'df1 ['code '] = df1 ['url ']. (df2 ['URL ']. values, df2 ['Code ']. 값, regex = True를 대체 할 때'Series.values'를 사용 해본 적이 있습니까?)'? 그것은''df1.code'가 아닌'DF2에서 df1.url'을 반환 @cant 나쁜 캐릭터가 – olegsson

+0

@IanS 그것은 형식 오류는'반환 .Code' –

답변

1

내 의견에 따라 pandas.Series.replace() 메서드는 및 value 인수로 Series 개체를 허용하지 않습니다. 목록을 전달하면 대신 작동합니다

df1['code'] = df1.url.replace(df2.URL.values, df2.Code.values, regex=True) 
print df1[['url', 'code']] 

다음과 같은 출력이 생성하여 추가 의견에 대한 답변에서

            url \ 
0 sberbank.ru/ru/person/promo/10mnl?utm_source=V... 
1 online.rsb.ru/hb/faces/system/login/rslogin.js... 
2 online.rsb.ru/hb/faces/system/login/sms/sms.js... 
3    online.rsb.ru/hb/faces/rs/RSIndex.jspx 
4 online.rsb.ru/hb/faces/rs/payments/PaymentReq.... 
5    homecredit.ru/help/quest/feedback.php 

               code 
0 sberbank.ru/ru/person/promo/10mnl?utm_source=V... 
1 online.rsb.ru/hb/faces/system/login/rslogin.js... 
2 online.rsb.ru/hb/faces/system/login/sms/sms.js... 
3    online.rsb.ru/hb/faces/rs/RSIndex.jspx 
4 online.rsb.ru/hb/faces/rs/payments/PaymentReq.... 
5             15 

df1.url가 일치하지 않는 경우 당신이 행 df1.codedf2.Code를 얻을 수 없다 정규식 문자열이지만이 경우 대문자로 대신 값을 입력 할 수 있습니다 (예 : None). 이것은, 예를 들어, 다음 줄을 추가하여 수행됩니다

df1['code'] = df1.apply(lambda x: None if x.code == x.url else x.code, axis=1) 

경우 다음 print df1[['url', 'code']] 반환 :

            url code 
0 sberbank.ru/ru/person/promo/10mnl?utm_source=V... NaN 
1 online.rsb.ru/hb/faces/system/login/rslogin.js... NaN 
2 online.rsb.ru/hb/faces/system/login/sms/sms.js... NaN 
3    online.rsb.ru/hb/faces/rs/RSIndex.jspx NaN 
4 online.rsb.ru/hb/faces/rs/payments/PaymentReq.... NaN 
5    homecredit.ru/help/quest/feedback.php 15.0 
+0

'df1 [ 'code]'에만 코드를 어떻게 얻을 수 있습니까? 'df1.url'은'df2.URL'과 같은 숫자를 얻을 필요가 있습니까? –

+0

그러나'의 경우 DF1 [ 'URL']'인'alfabank.ru/GET-현금/신용 카드/신용 현금/#의 frame_credit_calc/buy'와'DF2 [ 'URL이']'인'alfabank.ru/get 내가'3/buy'을 얻을 교체 할 때 DF2 [ '코드']'에서 -money/신용 카드/신용 현금/#의 frame_credit_calc' 및 코드는'3입니다 나는'DF1의 [ '코드'] = '에 도착 후 3/buy '. 어떻게 3을 얻을 수 있습니까? –

+0

내가 잘못 본 것이 아니라면 그 문자열의 끝 부분에'. *'를 추가하면 그 문자열로 시작하는 모든 URL과 일치 할 것입니다. – olegsson