2017-02-07 2 views
2

Что я хочу сделать, так это добавить в DataFrame, который передается в качестве параметра в функцию вида того, что делается в следующем коде по функции fPandas: Невозможно добавить и переназначить в DataFrame внутри функции

df = pd.DataFrame(data=[(0,1), (0,1)], columns=['a', 'b']) 

df 
Out[58]: 
    a b 
0 0 1 
1 0 1 

def f(df): 
    df['a'] = 1 # The first column will be modified 
    # However the following will have no effect 
    df = df.append(pd.DataFrame(data=[(0, 1)], columns=['a', 'b'])) 


f(df) 
df 
# As we see `append` didn't have an effect on the df 
Out[61]: 
    a b 
0 1 1 
1 1 1 

Как видно из приведенного выше кода, append не действует, если DataFrame не возвращается. Есть ли причина, почему это происходит?

Edit:

Я думаю, что я понял причину после того, как я написал этот вопрос. Поскольку append создает новый объект, если новый объект не будет возвращен, то задание

df = df.append(pd.DataFrame(data=[(0, 1)], columns=['a', 'b'])) 

будет только пройти новый DataFrame на копию ссылки на df, копия, которая генерируется при вызове функции, и не оригинальным df. Таким образом, новый DataFrame теряется.

+0

append не работает на месте. Он создает новый Dataframe. Если вы не будете использовать возвращенный объект, вы останетесь с тем же Dataframe. – AndreyF

ответ

2

Кажется, вы забыли return df:

def f(df): 
    df['a'] = 1 # The first column will be modified 
    # However the following will have no effect 
    df = df.append(pd.DataFrame(data=[(0, 1)], columns=['a', 'b'])) 
    return df 

print (f(df)) 
    a b 
0 1 1 
1 1 1 
0 0 1 

Или лучше:

def f(df): 
    df['a'] = 1 # The first column will be modified 
    return df.append(pd.DataFrame(data=[(0, 1)], columns=['a', 'b']), ignore_index=True) 

print (f(df)) 
    a b 
0 1 1 
1 1 1 
2 0 1 

Я думаю, что если проверка DataFrame.append это вернуть новый object, так return необходимо.

+0

Да, я сделал это специально, потому что я пытаюсь проверить, может ли передача DataFrame по ссылке, если она переназначена. Как говорится в сообщении _ «Как мы видим из приведенного выше кода, append не имеет никакого эффекта, если DataFrame не возвращается. Есть ли причина, почему это происходит?» _ –

+0

Я думаю, что если проверить ['DataFrame.append'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.append.html) он возвращает новый объект, поэтому требуется «return» – jezrael

+0

Имеет смысл, поэтому новый объект является _volatile_ и получает потеряна, несмотря на то, что ей присвоен параметр функции –