2017-11-28 20 views
0

リストAには、 "|"で区切られた値が含まれていますこのリスト内の部分値を検索して置換する

df1['original']= ['aaa|bbb|ccc','aaa|ccc','aaa|ccc|ddd'] 

出力のようになります。別のDFで

aaa|bbb|ccc 
aaa|ccc 
aaa|ccc|ddd 

、私は別の2つの列を持っています。最初は、df1['title']=['aaa','bbb','ccc','ddd']のようになります。 それに対応して、私はdf1 ['title']の隣に別の列を持っています。 df1['new_value']=['x','y','z','w']

出力:

title new_value 
aaa  x 
bbb  y 
ccc  z 
ddd  w 

私はdf1['original']内のすべての値を検索し、df1['title']df1['new_value']に基づいて検索結果に置き換えたいです。元の列に|を保存します。そして、最終的な出力は次のようになります。

df1['New']=['x|y|z','x|z','x|z|w'] 

出力: 新

x|y|z 
x|z 
x|z|w 

をこれはpythonでこれを実現する方法の詳細Excelで条件付き検索と任意のアイデアのようなものですか?

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

以下のリンクは、1つの値を含むリンクとのみ一致します。 リスト内の値を検索して置換する(パンダ)

答えて

0

、お返事に感謝をreplace

df1['New']=df1.original.replace(df2.set_index('title').new_value.to_dict(),regex=True) 
df1 
Out[758]: 
     original New 
0 aaa|bbb|ccc x|y|z 
1  aaa|ccc x|z 
2 aaa|ccc|ddd x|z|w 
+0

この場合、 'df2'とは何ですか? – dawg

+0

@dawg *別のdf *では、私はそれがopの入力だと思います、そうですか? – Wen

+0

それは有望ですが、与えられた例は 'df1'のすべての列です...しかし、彼の例も間違っているかもしれません;-) – dawg

0

formatメソッドを使用してこの悪用ハッキングはどうですか? Pythonで

In = ['aaa|bbb|ccc','aaa|ccc','aaa|ccc|ddd'] 
replace = 'aaa x bbb y ccc z ddd w' 
# use the infamous grouper (if you have keys and values in separate 
# lists you don't need this) to get a dict: 
replace = iter(replace.split()) 
replace = dict(zip(*2*(replace,))) 
# enclose all templates with curlies 
# like 'aaa|bbb|ccc' -> '{aaa}|{bbb}|{ccc}' 
# and use .format 
Out = [('{' + s.replace('|', '}|{') + '}').format(**replace) for s in In] 
# ['x|y|z', 'x|z', 'x|z|w'] 
+0

こんにちはポールを使用して私たちをみましょう。これをループまで拡張できますか?私は実際に大きなデータセットを持っています。それはちょっとした例でした。私はPythonの初心者です。 –

+0

あなたがリストにあなたのすべての入力を持っているなら、明示的なループは必要ありません。出力は、いわゆる[list comprehension](https://en.wikipedia.org/wiki/List_comprehension)によって作成されます。 Inの巨大なリストを試してみてください。コードは変更せずに動作するはずです。 –

0

だけで、念入りに、あなたが行うことができます:

(パンダ・データ・フレームには本当に似ている)辞書を作成します。

df1={} 
df1['original']= ['aaa|bbb|ccc','aaa|ccc','aaa|ccc|ddd'] 
df1['title']=['aaa','bbb','ccc','ddd'] 
df1['new_value']=['x','y','z','w'] 

は、マッピングされた古いの辞書を作成します。新しいへ:

di=dict(zip(df1['title'], df1['new_value'])) 

説明した新しい辞書エントリを作成します。

nl=[] 
for sl in [s.split('|') for s in df1['original']]: 
    nl.append([di[e] for e in sl]) 

df1['New']=['|'.join(e) for e in nl] 
# {'New': ['x|y|z', 'x|z', 'x|z|w'],...} 
+0

ちょっと、あなたが辞書を作成すると、この場合、すべての入力を手動で入力することができますが、実際には非常に大きなデータセットがあります。どのように私はその場合にdictを作成する必要がありますか?何か提案してください。 –

+0

データフレームの列を使用するだけです。私のマニュアルの項目はほぼ同じになるはずです。 – dawg

関連する問題