wake-up-neo.net

Setzen Sie den Wert auf eine gesamte Spalte eines Pandas-Datenrahmens

Ich versuche, die gesamte Spalte eines Datenrahmens auf einen bestimmten Wert zu setzen.

In  [1]: df
Out [1]: 
     issueid   industry
0        001        xxx
1        002        xxx
2        003        xxx
3        004        xxx
4        005        xxx

Nach allem, was ich gesehen habe, ist loc die beste Methode, um Werte in einem Datenrahmen zu ersetzen (oder nicht?):

In  [2]: df.loc[:,'industry'] = 'yyy'

Ich habe jedoch immer noch diese viel diskutierte Warnmeldung erhalten:

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead

Wenn ich mache

In  [3]: df['industry'] = 'yyy'

Ich habe dieselbe Warnmeldung erhalten.

Irgendwelche Ideen? Arbeiten mit Python 3.5.2 und Pandas 0.18.1.

19
Ledger Yu

Python kann unerwartete Aktionen ausführen, wenn neue Objekte aus vorhandenen Objekten definiert werden. Sie haben oben in einem Kommentar angegeben, dass Ihr Datenrahmen entlang der Zeilen von df = df_all.loc[df_all['issueid']==specific_id,:] definiert ist. In diesem Fall ist df wirklich nur ein Stand-In für die im df_all-Objekt gespeicherten Zeilen: Ein neues Objekt wird NICHT im Speicher erstellt.

Um diese Probleme insgesamt zu vermeiden, muss ich mich oft an die Verwendung des Moduls copy erinnern, das explizit das Kopieren von Objekten in den Speicher erzwingt, sodass auf die neuen Objekte aufgerufene Methoden nicht auf das Quellobjekt angewendet werden. Ich hatte das gleiche Problem wie Sie und habe es mit der Funktion deepcopy vermieden.

In Ihrem Fall sollte die Warnmeldung beseitigt werden:

from copy import deepcopy
df = deepcopy(df_all.loc[df_all['issueid']==specific_id,:])
df['industry'] = 'yyy'
8
Alex P. Miller

Du kannst tun : 

df['industry'] = 'yyy'
7
HH1

Sie können die Funktion assign verwenden:

df = df.assign(industry='yyy')
6
Mina HE
df.loc[:,'industry'] = 'yyy'

Das macht die Magie. Sie müssen '.loc' mit ':' für alle Zeilen hinzufügen. Ich hoffe es hilft

5
Nwoye CID

Ich hatte schon einmal ein ähnliches Problem mit diesem Ansatz df.loc[:,'industry'] = 'yyy', aber als ich das Notizbuch aktualisiert habe, lief es gut.

Möglicherweise möchten Sie versuchen, die Zellen zu aktualisieren, nachdem Sie df.loc[:,'industry'] = 'yyy'.

0
John Mutuma

Angenommen, Ihr Datenrahmen ist wie "Daten", müssen Sie berücksichtigen, ob Ihre Daten eine Zeichenfolge oder eine Ganzzahl sind. Beide werden unterschiedlich behandelt. In diesem Fall müssen Sie also genau angeben.

import pandas as pd

data = [('001','xxx'), ('002','xxx'), ('003','xxx'), ('004','xxx'), ('005','xxx')]

df = pd.DataFrame(data,columns=['issueid', 'industry'])

print("Old DataFrame")
print(df)

df.loc[:,'industry'] = str('yyy')

print("New DataFrame")
print(df)

Wenn Sie nun Zahlen anstelle von Buchstaben eingeben möchten, müssen Sie ein Array erstellen

list_of_ones = [1,1,1,1,1]
df.loc[:,'industry'] = list_of_ones
print(df)

Oder wenn Sie Numpy verwenden

import numpy as np
n = len(df)
df.loc[:,'industry'] = np.ones(n)
print(df)