2017-06-26 7 views
1

は、私は次のようなdataframe1がありますは、列の値を変更するために別のデータフレームを使用して - Pythonのパンダ

A B C D 
1 111 a 9 
2 121 b 8 
3 122 c 7 
4 121 d 6 
5 131 e 5 

また、私は別のdataframe2持っている:私が欲しいもの

Code String 
    111  s 
    12  b 
    13  u 

してデータフレームをクリートすることです次のように入力します。

A B C D 
1 111 S 9 
2 121 b 8 
3 122 c 7 
4 121 b 6 
5 131 u 5 

これは、最初のn桁(nは桁数dataframe2のコード欄で)、コードと同じ数字があれば、dataframe1の列Cはdataframe2の文字列に対して変更されます。

答えて

1

これは必要なものですか?コードはあまり素敵ではありませんが、仕事です。

import pandas as pd 
DICT=df2.set_index('Code').T.to_dict('list') 

Temp=[] 

for key, value in DICT.items(): 
    n=len(str(key)) 
    D1={str(key):value[0]} 
    T=df1.B.astype(str).apply(lambda x: x[:n]).map(D1) 

    Temp2=(df1.B.astype(str).apply(lambda x: x[:n])) 
    Tempdf=pd.DataFrame({'Ori':df1.B,'Now':Temp2,'C':df1.C}) 
    TorF=(Tempdf.groupby(['Now'])['Ori'].transform(min) == Tempdf['Ori']) 

    for n, i in enumerate(T): 
     if TorF[n]==False: 
      T[n]=Tempdf.ix[n,0] 
    Temp.append(T) 
df1.C=pd.DataFrame(data=Temp).fillna(method='bfill').T.ix[:,0] 

Out[255]: 
    A B C D 
0 1 111 s 9 
1 2 121 b 8 
2 3 122 c 7 
3 4 121 b 6 
4 5 131 u 5 
+0

申し訳ありませんが、完璧に働いた!計算コストを上げる方法はありますか? –

+0

申し訳ありませんが、コードに問題があります。そして、実際にはそれを出力で見ることができます。行番号3では、Bが122であり、Cがbでなければならない。 –

+0

私はこのソリューションを昨日作成したときにこのパートで混乱しました。キー12 - > bを使用するとnは2になります。そして、df1.Bの文字列をn = 2でサブセット化する必要がありますか? 122が12になり、cをbに変更します – Wen

関連する問題