2017-06-26 6 views
1

ich eine dataframe1 wie die folgende haben: Auchverschiedenen Datenrahmen verwenden Spaltenwerte zu ändern Python Pandas

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

, habe ich eine andere dataframe2:

Code String 
    111  s 
    12  b 
    13  u 

Was ich will, ist ein Datenrahmen creat wie folgt:

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

Das wäre, nehmen Sie die ersten n Ziffern (wobei n die Anzahl der Ziffern ist in der Spalte Code von dataframe2) und wenn es die gleichen Zahlen wie der Code hat, würde sich die Spalte C in dataframe1 für die Zeichenkette in dataframe2 ändern.

Antwort

1

Ist das was du willst? Der Code ist nicht sehr sauber, aber Arbeit ..

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

Entschuldigung Es dauerte lange! Arbeitete perfekt! Gibt es eine Möglichkeit, die Rechenkosten zu verbessern? –

+0

Es tut mir leid, ich habe ein Problem mit dem Code. Und tatsächlich können Sie es in der Ausgabe sehen. In Reihe 3 ist B 122 und C ist b, wenn es c sein sollte. –

+0

Ich auch verwirrt durch diesen Teil, wenn ich diese Lösung gestern generiert, wenn wir Schlüssel 12 verwenden -> b, n sollte 2 sein, und wir sollten Teilmenge Zeichenfolge in DF1.B mit n = 2 oder? dann 122 wird 12 sein und wir sollten c in b ändern – Wen

Verwandte Themen