2

I have a problem. I want to create a new column adress. Before that I want to get only all columns where namecode === code but unfortunately I got an error A value is trying to be set on a copy .... I looked at (see below) but nothing worked for me.

    customerId  code    namecode    name    street          adresscode
0   1           1       1           Mike    Long Street     458
1   2           1       1           Jucie   Short Street    856
2   3           9999    48           Max    Average Street  874

import pandas as pd

import pandas as pd
d = {'customerId': [1, 2, 3],
     'code': [1, 1, 9999],
     'name_code': [1, 1, 48],
     'name': ['Mike', 'Jucie', 'Max'],
     'street': ['Long Street', 'Short Street', 'Average Street'],
     'adresscode': ['458', '856', '874']
    }
df_old = pd.DataFrame(data=d)

display(df_old)

df_new = df_old.loc[df_old['code'] == df_old['name_code']]


>>> df_new['adress'] = df_new ['name'].copy() + df_new ['street'].copy() + df_new ['adresscode'].copy()

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


>>> df_new['adress'] = df_new .loc['name','street','adresscode']

[OUT]
IndexingError: Too many indexers


What I want

    customerId  code    namecode    name    street          adresscode adress
0   1           1       1           Mike    Long Street     458        Mike Long Street 458
1   2           1       1           Jucie   Short Street    856        Jucie Short Street 856
Test
  • 571
  • 13
  • 32
  • your code is currently not reproducible – mozway May 24 '22 at 07:47
  • I still get different errors, for instance `df_new.loc['name','street','adresscode']` makes no sense in pandas, what are you trying to achieve? – mozway May 24 '22 at 07:50
  • Please try `df_new['adress'] = df_new ['name'].copy() + df_new ['street'].copy() + df_new ['adresscode'].copy()`. I want to create a new column `adress` – Test May 24 '22 at 07:51

1 Answers1

3

You need to copy when slicing, not when assigning:

df_new = df_old.loc[df_old['code'] == df_old['name_code']].copy()
df_new['adress'] = df_new['name'] + df_new['street'] + df_new['adresscode']

output (without SettingWithCopyWarning):

   customerId  code  name_code   name        street adresscode  \
0           1     1          1   Mike   Long Street        458   
1           2     1          1  Jucie  Short Street        856   

                 adress  
0    MikeLong Street458  
1  JucieShort Street856

For you other slicing, you need to use a list of columns:

df_new = df_old[['name','street','adresscode']].copy()
# OR
df_new = df_old.loc[:, ['name','street','adresscode']].copy()
mozway
  • 194,879
  • 13
  • 39
  • 75