Я часто следую соглашению (к лучшему или к худшему) загрузки данных и манипуляций с предварительной обработкой в одной строке связанных команд 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
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Использование pandas `.assign()` для создания столбца, содержащего строковый скаляр
Anonymous » » в форуме Python - 0 Ответы
- 27 Просмотры
-
Последнее сообщение Anonymous
-