2016-03-23 18 views
2

Bu betiğin son 2 ya da 3 ay boyunca gayet iyi çalıştığını gördüm, ve sonra ne anlama geldiğimi bilemiyorum. Python'u veya bu betikte kullandığım herhangi bir kütüphaneyi güncellemedim, ama her neyse, şimdi düzeltmek için yardıma ihtiyacım var. IValueError: Paketi açmak için 1'den fazla değere ihtiyacınız var, kodumu nasıl daha güçlü yapabilirim?

sonraki adım "CONTACT_NAME" bölmek '_' boşlukların alt durumda tüm dönüştürme ve değiştirerek bu sütunları temizlemek

Company, Registered date, Contact name, Contact email, Contact phone 

aşağıdaki gibi dataframe başlatmak için

olduğu "(ilk) (son)" yani "John Doe" olarak başlayan sütun ve ilk ve son için 2 sütun eklemek istiyorum. Yeni DF

company, registered_date, contact_name, first_name, last_name, contact_email, contact_phone 

programı iletişim adı ve/veya yeni sütunların oluşturulması bölünmesine de kırılıyor, şöyle. Bunu yapmak için kullanıyoruz kod satırı:

df1['first_name'], df1['last_name'] = zip(*df1['registrant_name'].apply(lambda x: x.split(' ', 1))) 

traceback diyor ki:

File "(name).py", line 123 
df1['first_name'], df1['last_name'] = zip(*df1['registrant_name'].apply(lambda x: x.split(' ', 1))) 
ValueError: need more than 1 value to unpack 

ben line.split kullanarak aynı sorun ile birini buldum bazı badireler bakarken (Pandaların içinde değil, genel olarak sadece python) ve birisi muhtemelen her iki değerin orada olmadığı için olduğunu söyledi. Tabii ki, bu 3 ay içinde ilk kez "contact_name" sütununda "John Doe" olmak yerine, sadece "John" olmakla sonuçlanan ilk defa bu gibi görünüyor (Neyse ki bu kelimenin tam anlamıyla ilk girdi) Bu CSV’de başka bir sıraya bakmaya çalışırken bir süreliğine boğuldum.

Benim sorum şu ki, kodumu nasıl daha sağlam yapabilirim, böylece bu sorun ortaya çıkarsa, onu çözebiliriz. Ne yapmak istediğimi düşünüyorum, eğer alan yoksa, sadece mevcut değeri "first_name" olarak alacak ve sonra da "NaN" yi soyad olarak ekleyecektir. Sadece bir DF içinde nasıl yapılacağını bilmiyorum, çünkü döngü ideal değildir.

Yardımın için teşekkürler!

+0

.. bunun yerine split() 'yi. – IanS

cevap

2

Belki str.partition ile itemgetter kullanın::

import pandas as pd 


df = pd.DataFrame(["foo bar" , "foo", "bar barf"],columns=["name"]) 
from operator import itemgetter 


df['first_name'], df['last_name'] = zip(*df['name'].apply(lambda x: itemgetter(0,2)(x.partition(' ')))) 

size bir verecekti onlar testi geçersiz kılabilir gibi, ilk beyaz boşluk şerit önemli olduğunu unutmayın son isimleri kaçırmak için boş dize, bu yüzden istenip istenmediğinden emin değilim.

 name first_name last_name 
0 foo bar  foo  bar 
1  foo  foo   
2 bar barf  bar  barf 

emin değil bu hızlı ya da değil olacak ama lambda önler eğer: Eğer lambda fonksiyonu kaçınılması ve `df1 [ 'registrant_name'] str kullanmış olabilir Kodunuzda

import pandas as pd 

df = pd.DataFrame(["foo bar" , "foo", "bar barf"],columns=["name"]) 
from operator import itemgetter 


df['first_name'], df['last_name'] = zip(*map(itemgetter(0, 2), df['name'].str.partition(" ").values)) 
print(df) 
+1

Güzel, 'bölüm' hakkında unutmuştum. – IanS

+0

Hmm. Operatör Python içinde bir varsayılan kütüphane mi? Ya da yüklemem gereken bir şey var, çünkü bu kodu çalıştırmak için bir sürü hata atıyor. – Mxracer888

+0

Ne tür hatalar alıyorsunuz? 'operator.itemgetter' yerleşik bir yöntem –

1

Aradığınızı, 'John Doe' numaralı telefondan ['John', 'Doe'] ve ['John', ''] numaralı telefondan 'John' numaralı telefondan geri dönmenin bir yoludur. Bu şekilde paketin açılması için iki değeriniz olacaktır.

kesinlikle farklı çözümler vardır, ama ben bir döngü önler birini önerebilir:

x.split(' ', 1) if ' ' in x else [x, ''] 

Karşılaştığınız hatayı kaçınmalıdır senin lambda fonksiyonu içine bu takma.

df1['registrant_name'].str.strip().apply(lambda x: x.split(' ', 1) if ' ' in x else [x, '']) 
+0

İsim (x.split())> 1 else [x, ''] 'durumunda olduğu gibi x.split() 'de olduğu gibi iki kez adların sıyrılmasını önlemek için çok yol katettiğimi unutmayın. – IanS

İlgili konular