web-dev-qa-db-fra.com

Définir la valeur sur une colonne entière d'un cadre de données pandas

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.

19
Ledger Yu

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'
8
Alex P. Miller

Tu peux faire : 

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

Vous pouvez utiliser la fonction assign :

df = df.assign(industry='yyy')
6
Mina HE

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)