Ich habe einen Datenrahmen, der ein bisschen wie dieses Beispiel aussieht. Aus bestimmten Gründen wird für die Rohdaten der Wert repliziert.
Node Node 1 Value Node 2 Value Node 3 Value
0 1 A B C
1 2 A B C
2 3 A B C
Ich möchte es so umwandeln, dass es so aussieht:
Node Value
0 1 A
1 2 B
2 3 C
Dieser iterrows Code funktioniert wie beabsichtigt, ist aber für meine Daten sehr langsam (48 Knoten mit ~ 20.000 Werten).
Ich habe das Gefühl, dass es einen schnelleren Weg geben muss, vielleicht mit, apply
aber ich kann es nicht herausfinden.
import pandas as pd
df = pd.DataFrame({"Node": ["1", "2", "3"],
"Node 1 Value": ["A","A","A"],
"Node 2 Value": ["B","B","B"],
"Node 3 Value": ["C","C","C"]})
print(df)
for index, row in df.iterrows():
df.loc[index, 'Value'] = row["Node {} Value".format(row['Node'])]
print(df[['Node','Value']])
Verwenden Sie DataFrame.lookup
und dann DataFrame.assign
:
a = df.lookup(df.index, "Node " + df.Node.astype(str) + " Value")
df = df[['Node']].assign(Value = a)
print (df)
Node Value
0 1 A
1 2 B
2 3 C
BEARBEITEN: Wenn einige Werte fehlen, können Sie diese Werte numpy.setdiff1d
für das Wörterbuch mit dem Standardwert extrahieren , z. B. np.nan
und zuvor zu DataFrame hinzufügen lookup
:
print (df)
Node Node 1 Value Node 2 Value Node 3 Value
0 1 A B C
1 2 A B C
3 5 A B C
s = "Node " + df.Node.astype(str) + " Value"
new = dict.fromkeys(np.setdiff1d(s, df.columns), np.nan)
print (new)
{'Node 5 Value': nan}
print (df.assign(**new))
Node Node 1 Value Node 2 Value Node 3 Value Node 5 Value
0 1 A B C NaN
1 2 A B C NaN
3 5 A B C NaN
a = df.assign(**new).lookup(df.index, s)
print (a)
['A' 'B' nan]
df = df[['Node']].assign(Value = a)
print (df)
Node Value
0 1 A
1 2 B
3 5 NaN
Eine andere Idee mit Definition der Suche :
def f(row, col):
try:
return df.at[row, col]
except:
return np.nan
s = "Node " + df.Node.astype(str) + " Value"
a = [f(row, col) for row, col in zip(df.index, s)]
df = df[['Node']].assign(Value = a)
print (df)
Node Value
0 1 A
1 2 B
3 5 NaN
Und Lösung mit DataFrame.melt
:
s = "Node " + df.Node.astype(str) + " Value"
b = (df.assign(Node = s)
.reset_index()
.melt(['index','Node'], value_name='Value')
.query('Node == variable').set_index('index')['Value'])
df = df[['Node']].join(b)
print (df)
Node Value
0 1 A
1 2 B
3 5 NaN
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen