Панды обновляют изменения в добавленных значениях, которые впоследствии изменяются - PullRequest
1 голос
/ 30 сентября 2019

У меня есть код, в котором я открываю электронную таблицу, читаю ее, сохраняю в многомерном массиве и ищу совпадения строк.

import pandas as pd
import numpy as np

file = pd.ExcelFile("File.xlsx")

top100 = []
pub = []
ind = []
missed = []

for i in range(len(file.sheet_names)):
    year = 2005 + i
    df_aux = pd.read_excel(file, str(year))
    top100.append(df_aux)
    df_aux2 = pd.read_excel("AnotherFile"+str(year+".xls")
    pub.append(df_aux2)
    ind_aux = []
    missed_aux = []
    df_aux2['Contributors'] = df_aux2['Contributors'].str.replace(" ",'')
    df_aux['Institution'] = df_aux['Institution'].str.replace(" ",'')    
    for j in range(len(df_aux2)):
        a = np.where(df_aux2['Contributors'][j] == df_aux['Institution'])[0]
        if len(a)>0:
            ind_aux.append(j)
        else:
            missed_aux.append(j)
    ind.append(ind_aux)
    missed.append(missed_aux)

Цель кода - найти совпадения всписки. Поскольку они являются строками и имеют некоторые проблемы, я удаляю все пробелы. Насколько я понимаю, это не должно изменить то, что уже было добавлено, но если я напечатаю, например, pub [0], я получу все слова без пробелов.

print(pub[0]['Contributors'])
"Therearenospaces"

Почему это происходит?

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Это происходит потому, что с pub.append(df_aux2) у вас фактически нет двух разных значений. Присвоение просто копирует ссылку на значение, а не на фактический фрейм данных, поэтому и добавленный df_aux2, и формальный df_aux2 ссылаются на одну и ту же переменную после присваивания. Чтобы на самом деле скопировать список, вы можете использовать метод list.copy(), который доступен начиная с Python 3.3. Если я не ошибаюсь, это должно сработать:

new_pub = pub.append(df_aux2).copy()
0 голосов
/ 30 сентября 2019

На основании ответа Целиуса Стингера сработало следующее:

new_pub = pub.copy()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...