Я часто следую соглашению (к лучшему или к худшему) загрузки данных и манипуляций с предварительной обработкой в одной строке связанных команд pandas. В одной из таких манипуляций мне нужно умножить набор столбцов на скалярное значение, и я подумал, что могу добиться этого, используя синтаксис .assign(**kwargs) с соответствующим словарем пар, вызываемых ключевым словом. Однако при этом я получаю неправильные значения. Вероятно, я упускаю из виду какую-то проблему, связанную с пониманием диктовок, изменяемыми объектами и/или лямбда-функциями. Я надеюсь, что кто-нибудь сможет сообщить мне, почему/что происходит в прилагаемом минимальном рабочем примере. Также приветствуются любые предложения по улучшению практики. Заранее спасибо.
import sys
import pandas as pd
print(f'python version: {sys.version.split()[0]}')
print(f'pandas version: {pd.__version__}\n')
# dataframe
df = pd.DataFrame({'i1': [0.001, -0.30, -0.018, 0., 0.],
'i2': [0.001, -0.029, -0.007, 0., 0.],
'i3': [0., -0.03, -0.004, 0., 0.]})
print('##### df')
print(df)
# re-assigned dataframe: values are different from df, expected to be the same
# looks like i3 is simply copied into i1 and i2
print('\n##### df after reassignment')
df2 = df.assign(**{key: lambda df: 1*df[key] for key in ['i1', 'i2', 'i3']})
print(df2)
# piped dataframe: values are same as df, expected to be the same
def pipe_func(df, keys):
df[keys] = 1*df[keys]
return df
print('\n##### df after pipe_func')
df3 = df.pipe(pipe_func, keys=['i1', 'i2', 'i3'])
print(df3)
Мой результат:
python version: 3.9.16
pandas version: 2.0.3
##### df
i1 i2 i3
0 0.001 0.001 0.000
1 -0.300 -0.029 -0.030
2 -0.018 -0.007 -0.004
3 0.000 0.000 0.000
4 0.000 0.000 0.000
##### df after reassignment
i1 i2 i3
0 0.000 0.000 0.000
1 -0.030 -0.030 -0.030
2 -0.004 -0.004 -0.004
3 0.000 0.000 0.000
4 0.000 0.000 0.000
##### df after pipe_func
i1 i2 i3
0 0.001 0.001 0.000
1 -0.300 -0.029 -0.030
2 -0.018 -0.007 -0.004
3 0.000 0.000 0.000
4 0.000 0.000 0.000
Подробнее здесь: https://stackoverflow.com/questions/792 ... ect-values
Переназначение столбцов pandas в цепочке .assign() дает неверные значения ⇐ Python
Программы на Python
1733336138
Anonymous
Я часто следую соглашению (к лучшему или к худшему) загрузки данных и манипуляций с предварительной обработкой в одной строке связанных команд pandas. В одной из таких манипуляций мне нужно умножить набор столбцов на скалярное значение, и я подумал, что могу добиться этого, используя синтаксис .assign(**kwargs) с соответствующим словарем пар, вызываемых ключевым словом. Однако при этом я получаю неправильные значения. Вероятно, я упускаю из виду какую-то проблему, связанную с пониманием диктовок, изменяемыми объектами и/или лямбда-функциями. Я надеюсь, что кто-нибудь сможет сообщить мне, почему/что происходит в прилагаемом минимальном рабочем примере. Также приветствуются любые предложения по улучшению практики. Заранее спасибо.
import sys
import pandas as pd
print(f'python version: {sys.version.split()[0]}')
print(f'pandas version: {pd.__version__}\n')
# dataframe
df = pd.DataFrame({'i1': [0.001, -0.30, -0.018, 0., 0.],
'i2': [0.001, -0.029, -0.007, 0., 0.],
'i3': [0., -0.03, -0.004, 0., 0.]})
print('##### df')
print(df)
# re-assigned dataframe: values are different from df, expected to be the same
# looks like i3 is simply copied into i1 and i2
print('\n##### df after reassignment')
df2 = df.assign(**{key: lambda df: 1*df[key] for key in ['i1', 'i2', 'i3']})
print(df2)
# piped dataframe: values are same as df, expected to be the same
def pipe_func(df, keys):
df[keys] = 1*df[keys]
return df
print('\n##### df after pipe_func')
df3 = df.pipe(pipe_func, keys=['i1', 'i2', 'i3'])
print(df3)
Мой результат:
python version: 3.9.16
pandas version: 2.0.3
##### df
i1 i2 i3
0 0.001 0.001 0.000
1 -0.300 -0.029 -0.030
2 -0.018 -0.007 -0.004
3 0.000 0.000 0.000
4 0.000 0.000 0.000
##### df after reassignment
i1 i2 i3
0 0.000 0.000 0.000
1 -0.030 -0.030 -0.030
2 -0.004 -0.004 -0.004
3 0.000 0.000 0.000
4 0.000 0.000 0.000
##### df after pipe_func
i1 i2 i3
0 0.001 0.001 0.000
1 -0.300 -0.029 -0.030
2 -0.018 -0.007 -0.004
3 0.000 0.000 0.000
4 0.000 0.000 0.000
Подробнее здесь: [url]https://stackoverflow.com/questions/79252313/reassigning-pandas-columns-in-chained-assign-gives-incorrect-values[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия