2017-04-24 6 views
0

私は、列の1つが名字であるdatafromを持っています。名前の性別を推測するにあたって、gender-guesserライブラリからファーストネームを渡したいと思います。しかし、私は新しい「性別」列を作成して「姓」列からのデータを渡すためにしようとすると:既存の列に関数出力を新しい列に取り込む方法

df_names['Gender'] = gender.Detector().get_gender(df_names['First Name']) 

私はそれが何かをしていると思います

TypeError: 'Series' objects are mutable, thus they cannot be hashed 

エラーを取得ジェンダーの推測家が何をしているのかとは関係ないが、私は100%確実ではない。私はジェンダーの推測者とパンダの両方にトレースバックを取得します。私は推測者に文字列を渡すことができ、問題なくリターンすることができます。私はまた、 'ファーストネーム'データを別の文字列と連結して有効な出力を得るために、自分のスーパーシンプルな関数を書くことができます。 like:

def concat(x): 
    return x+" something more" 

df_names['More'] = concat(df_names['First Name']) 

期待通りに動作します。一致する内容の新しい列を作成します。

また、ilocを使用して1つの正しい戻り値を取得することもできます。私はforループを動作させることができましたが、実際には長すぎます。それはあなたがget_genderメソッドの実装の詳細に実行しているように、最も可能性の高いPythonはfirst nameオブジェクトの__hash__メソッドを呼び出すと、スローする原因と思われる、ディクショナリのキーとしてFirst Nameを使用しようとしているに見えます

+0

'df_names [ '性別'] = df_names [ '姓']を動作するはずです適用されます。(ラムダX:。gender.Detector()get_gender(X))' –

+0

これは私が私は結果を与えるん期待していますが、iloを使ってforループを繰り返すよりも速くはないようですc [i]。 – the3rdNotch

答えて

0

エラー(in the codeが表示されます)。

あなたはすでにあなたのconcat方法で観察してきたように、この問題を回避取得するための鍵は、単なる文字列にfirst nameオブジェクトをキャストすることがあります

df_names['Gender'] = gender.Detector().get_gender(
    str(df_names['First Name']) # make First Name a generic str instance 
) 
+0

提案してくれてありがとう@ジャイモン!これはエラーを乗り越え、すべてが苦情なしで実行されます。ただし、「不明」のみが返されます。私はこれまで 'df_names ['First Name']。str'と同じ '未知'の結果でキャストしようとしました。 'print(df_names ['First Name']。str)'は ''を 'get_gender'に送信していることを示しています。あなたが言った方法が似たようなことをしていないのかどうか疑問に思います。あなたの提案を印刷することは、人間が読める出力を返します。 – the3rdNotch

+0

Hrmの場合、 'gender.Detector()。names'に[名前が含まれていないと]' unknown 'が返されたようです(https://github.com/lead-ratings/gender-guesser/blob/master/gender_guesser /detector.py#L88)、私はそれが何かに人口を積んでいることを確認し、そこから行く – Jaymon

0

は男女検出器を使用することはありませんが、私はこれを推測しています

gd = gender.Detector() 
df_names['Gender'] = df_names['First Name'].apply(gd.get_gender) 
関連する問題