Подскажите, в чём дело.
Создаю 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
Комментариев нет:
Отправить комментарий