2016-03-23 14 views
2

私は過去2〜3ヶ月間このスクリプトを正常に実行していましたが、何らかの理由で私はそれが私に侵入すると判断したことを知らなかったのです。私はこのスクリプトで使用しているPythonやライブラリを更新していませんが、今はそれを修正する手助けが必要です。ValueError:解凍するには1以上の値が必要です。コードをより堅牢にするにはどうすればよいですか?

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

を次のようにデータフレームを起動する

私は小文字に全てを変換し、「_」とスペースを交換することによってそれらの列をクリーンアップである

次のステップは、「CONTACT_NAME」を分割することです「(最初)(最後)」、つまり「John Doe」として始まり、最初と最後の2つの列を追加したいと考えています。新しいDFは次のようになります。

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

連絡先名の分割および/または新しい列の作成でプログラムが壊れています。私はこれを行うために使用されているコードの行は次のとおりです。

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

トレースバック氏は述べています:

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 

私はline.splitを使用して、この同じ問題を持つ人を発見したいくつかのものに目を通したよう(パンダの中ではなく一般的にはPython)、誰かがそれはおそらく両方の値がそこにないからだと言いました。確かに、これは3ヶ月ぶりに "contact_name"の列にちょうど1つの値で終わったようです。 "John Doe"の代わりに、それはちょうど "John"です(幸いにもこれは文字通り最初のエントリでしたそうでなければ私は一列ごとに目を通してみるとしばらく困惑しました)。

私の質問は、私のコードをより堅牢にするために、どうすればこの問題が再び発生した場合に解決できるのかです。私は何をしたいのかと思っています。スペースがない場合は、現在の値を "first_name"として取得し、最後に "NaN"を追加します。ループは理想的ではないので、私はDF内でそれを行う方法を知りません。

ありがとうございました!

+0

を。代わりにsplit() 'を使います。 – IanS

答えて

2

たぶんstr.partitionで itemgetter を使用姓が見つからない場合は空文字列なので、それが望ましいかどうかはわかりません。

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

わからない、これは速いかないだろうが、それはラムダ避け場合:あなたはラムダ関数を回避し、 `DF1 [「registrant_name」] STRを使用している可能性があなたのコードでは

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

ニース、私は 'パーティション'について忘れていた。 – IanS

+0

Hmm。演算子はPython内のデフォルトライブラリですか?それとも、コードを実行しようとするとエラーが発生するのでインストールする必要があります。 – Mxracer888

+0

どのようなエラーが発生しますか? 'operator.itemgetter'は組み込みのメソッドです –

1

['John', 'Doe']'John Doe'から、['John', '']'John'から返す方法を探してください。この方法で、解凍するには常に2つの値があります。

は確かにさまざまなソリューションがありますが、私はループを避けるものを提案することができます:

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

は、あなたが遭遇したエラーを回避する必要があり、あなたのlambda機能にこれを差し込みます。彼らはテスト無効になるだろうと、最初の空白を除去することが重要であることに注意してください:

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(' ')))) 

あなたを与えるだろう:

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

len(x.split())> 1 else [x、 ''] 'のように' x.split() 'のように、名前を2回削除することを避けるために、 – IanS