Copier toutes les valeurs dans une colonne d'une nouvelle colonne de pandas dataframe

C'est une question très simple, je n'arrive pas à trouver une réponse.

j'ai un dataframe comme celle-ci, appelée df:

  A     B     C
 a.1   b.1   c.1
 a.2   b.2   c.2
 a.3   b.3   c.3

puis j'extrait toutes les lignes de df, où la colonne ' B 'a une valeur de' B. 2". J'attribue ces résultats à df_2.

df_2 = df[df['B'] == 'b.2']

df_2 devient:

  A     B     C
 a.2   b.2   c.2

ensuite, je copie toutes les valeurs de la colonne 'B' dans une nouvelle colonne nommée 'D'. Faisant en sorte que df_2 devienne:

  A     B     C     D
 a.2   b.2   c.2   b.2

quand je préformer une tâche comme ceci:

df_2['D'] = df_2['B']

j'obtiens le message d'avertissement suivant:

une valeur essaie d'être définie sur une copie d'une tranche d'une DataFrame. Essayer utiliser. loc[row_indexer, col_indexer] = valeur à la place de

voir les mises en garde dans la documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy


j'ai aussi essayé d'utiliser .loc lors de la création de df_2 comme ceci:

df_2 = df.loc[df['B'] == 'b.2']

cependant, je reçois toujours l'avertissement.

Toute aide est grandement appréciée.

16
demandé sur Justin Buchanan 2015-09-20 07:38:04

3 réponses

vous pouvez simplement assigner le B pour la nouvelle colonne , Comme -

df['D'] = df['B']

Exemple/Demo -

In [1]: import pandas as pd

In [2]: df = pd.DataFrame([['a.1','b.1','c.1'],['a.2','b.2','c.2'],['a.3','b.3','c.3']],columns=['A','B','C'])

In [3]: df
Out[3]:
     A    B    C
0  a.1  b.1  c.1
1  a.2  b.2  c.2
2  a.3  b.3  c.3

In [4]: df['D'] = df['B']                  #<---What you want.

In [5]: df
Out[5]:
     A    B    C    D
0  a.1  b.1  c.1  b.1
1  a.2  b.2  c.2  b.2
2  a.3  b.3  c.3  b.3

In [6]: df.loc[0,'D'] = 'd.1'

In [7]: df
Out[7]:
     A    B    C    D
0  a.1  b.1  c.1  d.1
1  a.2  b.2  c.2  b.2
2  a.3  b.3  c.3  b.3
26
répondu Anand S Kumar 2015-09-20 04:51:08

le problème est dans la ligne avant celui qui lance l'avertissement. Quand vous créez df_2, c'est là que vous créez une copie d'une tranche d'une base de données. Au lieu de cela, lorsque vous créez df_2, utilisez.copier() et que vous n'obtenez pas de cette mise en garde plus tard sur.

df_2 = df[df['B'] == 'b.2'].copy()
11
répondu Alex 2015-09-20 17:13:26

je pense que la bonne méthode d'accès est l'aide de l'index:

df_2.loc[:,'D'] = df_2['B']
1
répondu Luke 2017-02-01 03:51:46