Страницы

Поиск по вопросам

вторник, 12 марта 2019 г.

Pandas изменение данных

Подскажите, в чём дело. Создаю DataFrame, хочу изменить значение, но ничего не выходит. В чём тут хитрость?
data = {'n':[1,1,1,1,1,1], 'bucket':['0','1-30','31-60','91-120','121-150','151-180'], 'balance':[1899.1644,1899.158,1741.408,1641.7814,1454.0343,1454.0343], 'date':['2016-01-16','2016-02-16','2016-03-16','2016-05-16','2016-06-16','2016-07-16']}
df = pd.DataFrame(data)
df.loc[5]['n']=100
Результат:

В маленьком примерчике такая же ерунда.
data = {'a':[1,2,3], 'b':['d','b','c']} df = pd.DataFrame(data) print(df) df.loc[0]['a'] = 100 print(df)

НО!!! Если числа, то всё ок:
data = {'a':[1,2,3], 'b':[5,6,7]} df = pd.DataFrame(data) print(df) df.loc[0]['a'] = 100 print(df)


Ответ

Pandas должен был выдать вам предупреждение (Warning), описывающее проблему:
In [7]: df.loc[5]['n']=100 C:\Users\Max\Anaconda4\Scripts\ipython3-script.py:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy if __name__ == '__main__':
In [8]: df Out[8]: balance bucket date n 0 1899.1644 0 2016-01-16 1 1 1899.1580 1-30 2016-02-16 1 2 1741.4080 31-60 2016-03-16 1 3 1641.7814 91-120 2016-05-16 1 4 1454.0343 121-150 2016-06-16 1 5 1454.0343 151-180 2016-07-16 1
Как это сделать правильно:
In [9]: df.loc[5, 'n'] = 100
In [10]: df Out[10]: balance bucket date n 0 1899.1644 0 2016-01-16 1 1 1899.1580 1-30 2016-02-16 1 2 1741.4080 31-60 2016-03-16 1 3 1641.7814 91-120 2016-05-16 1 4 1454.0343 121-150 2016-06-16 1 5 1454.0343 151-180 2016-07-16 100

Комментариев нет:

Отправить комментарий