Как условно изменить значения в столбце DataFrame (неитерационно)?
Дан DataFrame с тремя колонками. Задача - в третьей колонке оставить неокругленными значения из второй, если в первой число нецелое; и обратно - в третью записать округленные значения из второй, если в первой целое число; причем сделать это нужно неитерацинно.
Ниже приведу безуспешные попытки решения; concat и merge не помогли (либо не до конца разобрался):
Вариант 1. Делал так, однако, видимо, атрибут inplace для метода pandas.DataFrame.round отсутствует:
import pandas as pd
df = pd.DataFrame()
df['Am1'] = [1, 2.5, 4, 6.8]
df['Am2'] = df['Am1'] * 1.05
df['Am3'] = df['Am2']
df[df['Am2'] % 1 == 0]['Am3'].round(0)
Вариант 2.
df = pd.DataFrame()
df['Am1'] = [1, 2.5, 4, 6.8]
df['Am2'] = df['Am1'] * 1.05
df['Am3'] = df['Am2']
df['Am3'] = df[df['Am1'] % 1 == 0]['Am3'].round(0)
Вариант 3.
df = pd.DataFrame()
df['Am1'] = [1, 2.5, 4, 6.8]
df['Am2'] = df['Am1'] * 1.05
df['Am3'] = df.loc[df['Am1'] % 1 == 0, 'Am2'].round()
df['Am3'] += df.loc[df['Am1'] % 1 != 0, 'Am2']
Вариант 4.
df = pd.DataFrame()
df['Am1'] = [1, 2.5, 4, 6.8]
df['Am2'] = df['Am1'] * 1.05
df['Am3'] = df.loc[df['Am1'] % 1 == 0, 'Am2'].round().fillna(0, inplace=True)
df['Am3'] += df.loc[df['Am1'] % 1 != 0, 'Am2'].fillna(0, inplace=True)
Приведу решение с итерациями, чтобы был понятен ожидаемый результат:
df = pd.DataFrame()
df['Am1'] = [1, 2.5, 4, 6.8]
df['Am2'] = df['Am1'] * 1.05
df['Am3'] = df['Am2']
for i in df.index:
if df.loc[i, 'Am1'] % 1 == 0:
df.loc[i, 'Am3'] = df.loc[i, 'Am3'].round()
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
df.loc[df["Am1"] % 1 == 0, "Am3"] = df["Am3"].round()
результат:
In [19]: df
Out[19]:
Am1 Am2 Am3
0 1.0 1.050 1.000
1 2.5 2.625 2.625
2 4.0 4.200 4.000
3 6.8 7.140 7.140