k.ko3n
k.ko3n

Reputation: 954

Error message "A value is trying to be set on a copy of a slice from a DataFrame" with nan in the data

My task is to convert columns dcpower and acpower (whichever is applicable) from kW to watt if their current units is kW. My data contain nan but I don't want to remove them. Below is my script.

if powerunit == 'watt':
    pass

if powerunit == 'kW':
    if 'dcpower' in df.columns:
        df['dcpower'] = (df['dcpower'] * 1000.0).copy()
    else:
        pass
    if 'acpower' in df.columns:
        df['acpower'] = (df['acpower'] * 1000.0).copy()
    else:
        pass

The script works, but it returns SettingWithCopyWarning: 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... # This is added back by InteractiveShellApp.init_path()

By adding df.loc['power'] or df.iloc['power'] and .copy() at the end, it does not work in my machine.

df["dcpower"] = (df.iloc["dcpower"] * 1000.0, "dcpower").copy()

returns Cannot index by location index with a non-integer key.

Sample data


Iac power   wind    Tamb    RH  ghi dhi WDir    rain
Timestamp                                       
2019-04-02 17:35:00 3.62    0.84    nan 27.82   nan 194.10  33.56   28.52   nan
2019-04-02 17:40:00 3.04    0.69    nan 27.59   nan 152.22  35.96   28.58   nan
2019-04-02 17:45:00 2.51    0.54    nan 27.52   nan 112.86  34.04   28.78   nan
2019-04-02 17:50:00 2.11    0.40    nan 27.43   nan nan 34.51   29.00   nan
2019-04-02 17:55:00 1.86    nan nan 27.32   nan nan 30.63   29.10   nan

Any help is appreciated.

Edit: Python: 3.7.4
JupyterLab: 1.1.4

Upvotes: 0

Views: 59

Answers (1)

jezrael
jezrael

Reputation: 863291

For me your code working very nice with no error:

df = pd.DataFrame({
         'dcpower':[4,5,4,5,5,4],
         'acpower':[7,8,9,4,2,3],

})

powerunit = 'kW'
if powerunit == 'kW':
    if 'dcpower' in df.columns:
        df['dcpower'] = (df['dcpower'] * 1000.0)
    else:
        pass
    if 'acpower' in df.columns:
        df['acpower'] = (df['acpower'] * 1000.0)
    else:
        pass

print (df)
   dcpower  acpower
0   4000.0   7000.0
1   5000.0   8000.0
2   4000.0   9000.0
3   5000.0   4000.0
4   5000.0   2000.0
5   4000.0   3000.0

Upvotes: 1

Related Questions