2015-05-26 11 views
5

Ich möchte Zeilenwerte in Pandas ersetzen.Ersetzen von Zeilenwerten in Pandas

Im Beispiel:

import pandas as pd 
import numpy as np  

a = np.array(([100, 100, 101, 101, 102, 102], 
       np.arange(6))) 
pd.DataFrame(a.T) 

Ergebnis:

array([[100, 0], 
     [100, 1], 
     [101, 2], 
     [101, 3], 
     [102, 4], 
     [102, 5]]) 

Hier möchte ich die Zeilen mit den Werten [101, 3] mit [200, 10] ersetzen und das Ergebnis sollte daher sein:

array([[100, 0], 
     [100, 1], 
     [101, 2], 
     [200, 10], 
     [102, 4], 
     [102, 5]]) 

Aktualisieren

In einem allgemeineren Fall möchte ich mehrere Zeilen ersetzen.

Daher werden die alten und neuen Zeilenwerte durch nx2-große Matrizen dargestellt (n ist die Anzahl der zu ersetzenden Zeilenwerte). Im Beispiel:

old_vals = np.array(([[101, 3]], 
        [[100, 0]], 
        [[102, 5]])) 

new_vals = np.array(([[200, 10]], 
        [[300, 20]], 
        [[400, 30]])) 

Und das Ergebnis ist:

array([[300, 20], 
     [100, 1], 
     [101, 2], 
     [200, 10], 
     [102, 4], 
     [400, 30]]) 
+0

Sie müssen für mehrere Row-Case definieren, wie es abhängt – EdChum

Antwort

5

Für die einreihige Fall:

In [35]: 

df.loc[(df[0]==101) & (df[1]==3)] = [[200,10]] 
df 
Out[35]: 
    0 1 
0 100 0 
1 100 1 
2 101 2 
3 200 10 
4 102 4 
5 102 5 

Für die mehrreihige-Fall funktionieren würde, wie folgt vor:

In [60]: 

a = np.array(([100, 100, 101, 101, 102, 102], 
       [0,1,3,3,3,4])) 
df = pd.DataFrame(a.T) 
df 
Out[60]: 
    0 1 
0 100 0 
1 100 1 
2 101 3 
3 101 3 
4 102 3 
5 102 4 
In [61]: 

df.loc[(df[0]==101) & (df[1]==3)] = 200,10 
df 
Out[61]: 
    0 1 
0 100 0 
1 100 1 
2 200 10 
3 200 10 
4 102 3 
5 102 4 

Für mehrzeilige Aktualisierung wie Sie p ropose folgende funktionieren würde, wo die Ersatz-Website eine einzelne Zeile ist, wird zuerst ein dict des alten vals konstruieren zu suchen und die neuen Werte als Ersatzwert verwenden:

In [78]: 

old_keys = [(x[0],x[1]) for x in old_vals] 
new_valss = [(x[0],x[1]) for x in new_vals] 
replace_vals = dict(zip(old_keys, new_vals)) 
replace_vals 
Out[78]: 
{(100, 0): array([300, 20]), 
(101, 3): array([200, 10]), 
(102, 5): array([400, 30])} 

Wir können dann über die dict iterieren und dann die Zeilen der gleichen Methode wie meine erste Antwort unter Verwendung von:

In [93]: 

for k,v in replace_vals.items(): 
    df.loc[(df[0] == k[0]) & (df[1] == k[1])] = [[v[0],v[1]]] 
df 
    0 1 
0 100 0 
    0 1 
5 102 5 
    0 1 
3 101 3 
Out[93]: 
    0 1 
0 300 20 
1 100 1 
2 101 2 
3 200 10 
4 102 4 
5 400 30 
+0

Vielen Dank für die Anwsser. Für den allgemeinen (mehrzeiligen) Fall meinte ich, dass sich auch die neuen Werte ändern: daher werden die alten und neuen Werte durch ein nx2-großes Array repräsentiert. – blaz

+0

Also erfüllte meine Antwort diese Kriterien oder nicht, wenn nicht, müssen Sie die gewünschte Ausgabe – EdChum

+0

Ich habe meine Frage aktualisiert. – blaz

1

der einfachste Weg, dies sein sollte:

df.loc[[3],0:1] = 200,10 

In diesem Fall 3 ist die dritte Zeile des Datenrahmens während 0 und 1 die Spalten sind.

Dieser Code ermöglicht es Ihnen stattdessen, über jede Zeile zu iterieren, den Inhalt zu überprüfen und ihn durch das zu ersetzen, was Sie möchten.

target = [101,3] 
mod = [200,10] 

for index, row in df.iterrows(): 
    if row[0] == target[0] and row[1] == target[1]: 
     row[0] = mod[0] 
     row[1] = row[1] 

print(df) 
0

Eine andere Möglichkeit ist:

import io 

a = np.array(([100, 100, 101, 101, 102, 102], 
       np.arange(6))) 
df = pd.DataFrame(a.T) 

string = df.to_string(header=False, index=False, index_names=False) 

dictionary = {'100 0': '300 20', 
       '101 3': '200 10', 
       '102 5': '400 30'} 

def replace_all(text, dic): 
    for i, j in dic.items(): 
     text = text.replace(i, j) 
    return text 

string = replace_all(string, dictionary) 
df = pd.read_csv(io.StringIO(string), delim_whitespace=True) 

ich diese Lösung besser gefunden, da bei großen Datenmenge zu tun zu ersetzen, die Zeit ist kürzer als von EdChum Lösung.

Verwandte Themen