J'essaie de définir la colonne entière d'un cadre de données à une valeur spécifique.
In [1]: df
Out [1]:
issueid industry
0 001 xxx
1 002 xxx
2 003 xxx
3 004 xxx
4 005 xxx
D'après ce que j'ai vu, loc
est la meilleure pratique lors du remplacement de valeurs dans une trame de données (ou n'est-ce pas?):
In [2]: df.loc[:,'industry'] = 'yyy'
Cependant, j'ai quand même reçu ce message d'avertissement dont on parle beaucoup:
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
Si je fais
In [3]: df['industry'] = 'yyy'
J'ai le même message d'avertissement.
Des idées? Travailler avec Python 3.5.2 et les pandas 0.18.1.
Python peut faire des choses inattendues lorsque de nouveaux objets sont définis à partir d'objets existants. Vous avez indiqué dans un commentaire ci-dessus que votre cadre de données est défini comme suit: df = df_all.loc[df_all['issueid']==specific_id,:]
. Dans ce cas, df
est en réalité simplement un remplaçant pour les lignes stockées dans l'objet df_all
: un nouvel objet n'est PAS créé en mémoire.
Pour éviter complètement ces problèmes, je dois souvent me rappeler d'utiliser le module copy
, qui force explicitement la copie des objets en mémoire, de sorte que les méthodes appelées sur les nouveaux objets ne sont pas appliquées à l'objet source. J'ai eu le même problème que vous et je l'ai évité en utilisant la fonction deepcopy
.
Dans votre cas, cela devrait vous débarrasser du message d'avertissement:
from copy import deepcopy
df = deepcopy(df_all.loc[df_all['issueid']==specific_id,:])
df['industry'] = 'yyy'
Tu peux faire :
df['industry'] = 'yyy'
Vous pouvez utiliser la fonction assign
:
df = df.assign(industry='yyy')
En supposant que votre cadre de données ressemble à «Données», vous devez déterminer si vos données sont une chaîne ou un entier. Les deux sont traités différemment. Donc, dans ce cas, vous devez être spécifique à ce sujet.
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)
Maintenant, si vous voulez mettre des chiffres au lieu de lettres, vous devez créer un tableau
list_of_ones = [1,1,1,1,1]
df.loc[:,'industry'] = list_of_ones
print(df)
Ou si vous utilisez Numpy
import numpy as np
n = len(df)
df.loc[:,'industry'] = np.ones(n)
print(df)