2017-07-27 2 views
1

Ich möchte die Werte der Spalten „q1_body“ und „q2_body“ von Datenrahmen „Ergebnis“ mit den Werten der „Körper“ von der gleichen ID in Datenrahmen „df“ ersetzen, und der Code ist wie:Wie ersetzt man Werte in einem Datenrahmen mit Werten in einem anderen Datenrahmen basierend auf bestimmten Bedingungen?

def replace_body(x): 
    id1 = result.loc[x].qid1 
    result.loc[x].q1_body = df[df["qid"]==id1]["body"] 
    id2 = result.loc[x].qid2 
    result.loc[x].q2_body = df[df["qid"]==id2]["body"] 

result.index.map(lambda x: replace_body(x)) 

Wenn ich den Code ausführen bekam ich die folgende Erinnerung in meiner ipython Konsole und das Programm gerade hier fest:

//anaconda/lib/python3.6/site-packages/pandas/core/generic.py:3110:
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
self[name] = value

Hoffnung jemand kann mir sagen, was hier nicht stimmt.

die beiden Datenrahmen Angenommen sind:

Ergebnis:

qid1 q1_body qid2 q2_body 
1a abc 2a bcd 
1a abc 3a cde 
2a bcd 3a cde 

df:

qid body 
1a sfgaks 
2a shdfjk 
3a adjkwf 

Und die erwartete Ausgabe ist wie:

Ergebnis:

Hier 210

Antwort

2

Sie benötigen map von Series erstellt von set_index:

s = df.set_index('qid')['body'] 
result['q1_body'] = result['qid1'].map(s) 
result['q2_body'] = result['qid2'].map(s) 
print (result) 
    qid1 q1_body qid2 q2_body 
0 1a sfgaks 2a shdfjk 
1 1a sfgaks 3a adjkwf 
2 2a shdfjk 3a adjkwf 
+0

Warum map? "loc" würde tun, wie ich in meiner Antwort geschrieben habe. Einzige Sache, ich habe vergessen, den Index auf 'df' zu setzen ... Ups! :-P – Kartik

+0

'map' ist besser und offensichtlicher Weg für die Zuordnung von Daten. – jezrael

+0

Langsamer als '.loc'. Machen wir einen Zeittest, sollen wir? – Kartik

1

:

# Set index and get body as a series 
s = df.set_index(qid)['body'] 
result['q1_body'] = s.loc[result['qid1']].values 
result['q2_body'] = s.loc[result['qid2']].values 

Ergebnis:

qid1 q1_body qid2 q2_body 
0 1a sfgaks 2a shdfjk 
1 1a sfgaks 3a adjkwf 
2 2a shdfjk 3a adjkwf 

Timing (10k Zeilen, mit automatisch generierten Lorem):

Meine Methode My method

@ Jezareal hat sich getroffen hod @Jezreal's Method

+0

Danke. Ich habe versucht, Ihre Lösung, aber habe diesen Fehler: "KeyError: 'Keine von [0 1 \ n1 1 \ n2 2 \ nName: qid1, dtype: object] sind in der [index]'" –

Verwandte Themen