Область не то, что я ожидаю при использовании панд - PullRequest
2 голосов
/ 09 марта 2019

Я хочу ввести df в функцию, вызвать выходной файл другого фрейма данных 'df_fn' и иметь df неизменным.Как мне это сделать?

Мой код либо ничего не делает, и df_fn равно df или df_fn, и df оба изменены.

с использованием df_fn[cols][df_fn.fuel_type != 'gas'] = np.nan

import pandas as pd
import numpy as np

df = pd.DataFrame({'n_wheels': [2, 4, 4],
                   'color': ['red', 'blue', 'red'],
                   'year': [2010, 1990, 1999],
                   'fuel_type': ['diesel', 'gas', 'electric']})
print('df = \n', df)
def fn(df_fn):

    cols = ['n_wheels', 'color', 'year']
#     df_fn.loc[df_fn.fuel_type != 'gas', cols] = np.nan
    df_fn[cols][df_fn.fuel_type != 'gas'] = np.nan


    return df_fn

new_df = fn(df)
print('df = \n', df)
print('new_df = \n', new_df)

вывод:

df = 
    n_wheels color  year fuel_type
0         2   red  2010    diesel
1         4  blue  1990       gas
2         4   red  1999  electric

df = 
    n_wheels color  year fuel_type
0         2   red  2010    diesel
1         4  blue  1990       gas
2         4   red  1999  electric

new_df = 
    n_wheels color  year fuel_type
0         2   red  2010    diesel
1         4  blue  1990       gas
2         4   red  1999  electric

с использованием df_fn.loc[df_fn.fuel_type != 'gas', cols] = np.nan

print('df = \n', df)
def fn(df_fn):

    cols = ['n_wheels', 'color', 'year']
#     df_fn[cols][df_fn.fuel_type != 'gas'] = np.nan
    df_fn.loc[df_fn.fuel_type != 'gas', cols] = np.nan


    return df_fn

new_df = fn(df)
print('df = \n', df)
print('new_df = \n', new_df)

вывод:

df = 
    n_wheels color  year fuel_type
0         2   red  2010    diesel
1         4  blue  1990       gas
2         4   red  1999  electric
df = 
    n_wheels color    year fuel_type
0       NaN   NaN     NaN    diesel
1       4.0  blue  1990.0       gas
2       NaN   NaN     NaN  electric
new_df = 
    n_wheels color    year fuel_type
0       NaN   NaN     NaN    diesel
1       4.0  blue  1990.0       gas
2       NaN   NaN     NaN  electric

1 Ответ

2 голосов
/ 09 марта 2019

Вам нужно установить копию оригинала df

print('df = \n', df)
def fn(df_fn):
    cols = ['n_wheels', 'color', 'year']
#     df_fn[cols][df_fn.fuel_type != 'gas'] = np.nan
    df_fn.loc[df_fn.fuel_type != 'gas', cols] = np.nan
    return df_fn
df1=df.copy()#I change here add copy 
new_df = fn(df1)
print('df = \n', df)
print('new_df = \n', new_df)
df = 
    n_wheels color  year fuel_type
0         2   red  2010    diesel
1         4  blue  1990       gas
2         4   red  1999  electric
df = 
    n_wheels color  year fuel_type
0         2   red  2010    diesel
1         4  blue  1990       gas
2         4   red  1999  electric
new_df = 
    n_wheels color    year fuel_type
0       NaN   NaN     NaN    diesel
1       4.0  blue  1990.0       gas
2       NaN   NaN     NaN  electric
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...