2016-09-20 10 views
1

私はしばらくの間これを試しています。ここに問題があります:他のデータフレームを使用してデータフレーム内の値をPandasのキーとして文字列で置き換えます

私はCSVファイルにあるテキストに関するいくつかのメタデータを使って作業しています。

enter image description here

実際のテーブルにはより長く、より複雑ですが、それは同じロジックを次のとおりです:それはこのようになりますすべての行がテキストであり、すべての列は、テキストのさまざまな側面です。私はいくつかの列に多くのバリエーションを持っており、より簡単なものに改造したいと思っています。例えば、物語の観点から、ホモジエイテッドとオートジージェティックの値を非ヘテロジージェティックなものに変更する。

enter image description here

あなたが見ることができるように、メタデータのすべての列は、古い値が新しいモデル-キーワードの行を次のようになります。私はこのようになりますキーワードと呼ばれる別のCSVファイルでこの新しいモデルを定義します新しい値はnew_model列にあります。

この値をマップするか、Pandasを使用して置き換える必要があります。

import re 
import pandas as pd 

df_metadata = pd.read_csv("/metadata.csv", encoding="utf-8", sep=",") 
df_keywords = pd.read_csv("/keywords.csv", encoding="utf-8", sep="\t") 

for column_metadata,value_metadata in df_metadata.iteritems(): 

    if str(column_metadata) in list(df_keywords.loc[:,"term_type"]): 

     df_metadata.loc[df_metadata[column_metadata] == value_metadata, column_metadata] = df_keywords.loc[df_keywords["term_value"] == value_metadata, ["new_model"]] 

とPythonは必ず戻って、このエラーを与える:

"ValueError: Series lengths must match to compare"

私は問題はLOCと交換の第二部のvalue_metadataであると思うが、私はこれは私が今のところ持っているものですここでの意味:

df_keywords.loc[df_keywords["term_value"] == value_metadata, ["new_model"]] 

をvalue_metadataは、このコマンドの最初の部分で動作しますが、それは二番目にない理由私は理解していないものがある...

お願いします。よろしくお願いいたします。たぶん、データフレームを繰り返すより簡単な方法があるかもしれません...私は非常に提案に開放されています。敬具、 ホセ・

答えて

1

あなたが最初に古いものでslicersによって速く選択し、ループ内map新しい値をdf_keywordsMultiindexを作成することができます。

df_keywords.set_index(['term_type','term_value'], inplace=True) 

idx = pd.IndexSlice 
#first maping in column narrative-perspective 
print (df_keywords.loc[idx['narrative-perspective',:]].to_dict()['new_model']) 
{'heterodiegetic': 'heterodiegetic', 'other/mixed': 'n-heterodiegetic', 
'homodiegetic': 'n-heterodiegetic', 'autodiegetic': 'n-heterodiegetic'} 

#column names for replacing  
L = ['narrative-perspective','narrator','protagonist-gender'] 
for col in L: 
    df_metadata[col] = 
    df_metadata[col].map(df_keywords.loc[idx[col,:]].to_dict()['new_model']) 

print (df_metadata) 
    idno author-name narrative-perspective  narrator protagonist-gender 
0 ne0001  Baroja  n-heterodiegetic third-person    male 
1 ne0002  Galdos  heterodiegetic third-person    n-male 
2 ne0003  Galdos  n-heterodiegetic third-person    male 
3 ne0004  Galdos  n-heterodiegetic third-person    n-male 
4 ne0005  Galdos  heterodiegetic third-person    n-male 
5 ne0006  Galdos  heterodiegetic third-person    male 
6 ne0007  Sawa  heterodiegetic third-person    n-male 
7 ne0008 Zamacois  heterodiegetic third-person    n-male 
8 ne0009  Galdos  heterodiegetic third-person    n-male 
9 ne0011  Galdos  n-heterodiegetic n-third-person    male 

to_dictはomited、その後Seriesによりマッピングすることができます。

df_keywords.set_index(['term_type','term_value'], inplace=True) 
idx = pd.IndexSlice 

#first maping in column narrative-perspective 
print (df_keywords.loc[idx['narrative-perspective',:]]['new_model']) 
term_value 
autodiegetic  n-heterodiegetic 
heterodiegetic  heterodiegetic 
homodiegetic  n-heterodiegetic 
other/mixed  n-heterodiegetic 
Name: new_model, dtype: object 

L = ['narrative-perspective','narrator','protagonist-gender'] 
for col in L: 
    df_metadata[col] = df_metadata[col].map(df_keywords.loc[idx[col,:]]['new_model']) 

print (df_metadata) 
    idno author-name narrative-perspective  narrator protagonist-gender 
0 ne0001  Baroja  n-heterodiegetic third-person    male 
1 ne0002  Galdos  heterodiegetic third-person    n-male 
2 ne0003  Galdos  n-heterodiegetic third-person    male 
3 ne0004  Galdos  n-heterodiegetic third-person    n-male 
4 ne0005  Galdos  heterodiegetic third-person    n-male 
5 ne0006  Galdos  heterodiegetic third-person    male 
6 ne0007  Sawa  heterodiegetic third-person    n-male 
7 ne0008 Zamacois  heterodiegetic third-person    n-male 
8 ne0009  Galdos  heterodiegetic third-person    n-male 
9 ne0011  Galdos  n-heterodiegetic n-third-person    male 
+0

多くのありがとうございます! :) できます!両方のファイルの入力に依存するようにリモデリングするメタデータのリストを作成する最も良い方法として、あなたは何を提案しますか?今、私はこの3つのコラムを持っているので、明日私は20を持っているかもしれません...私はそれを行いますが、より良い方法を持っていると確信しています: ' list_ = []; df_metadata.columns.valuesでCOLUMN_NAMEため : STR場合、リスト中の(COLUMN_NAME)(df_keywords.loc [:、 "TERM_TYPE"]): list_.append(COLUMN_NAME)。 print(list_); ' 私はコメントのコードが素敵なレンダリングに作るために得ることはありません:(申し訳ありません! –

+0

私が最も簡単だと思う[' drop_duplicates'](http://pandas.pydata.org/pandas-docs/stable/生成/ pandas.Series.drop_duplicates.html) - 。 'プリント(df_keywords.term_type.drop_duplicates()ToListメソッド())' – jezrael

+0

多くの多くのおかげで良い一日を! –

関連する問題