Вставить значения по условию pandas
Пытаюсь подставить значения по условию c помощью map(), значения вставляются, но данные которые не нужно изменять меняются на NaN.
import pandas as pd
import numpy as np
df = pd.DataFrame([[1234, 'a', 'b', 'c', 'd'],
[2345, np.nan, np.nan, 'f', np.nan],
[2345, np.nan, np.nan, 'g', np.nan],
[6789, 's', 'asd', 'g', 'v']],
columns=['1', '2', '3', '4', '5'])
df['2'] = df['1'].map({2345: '1111111111', 6789:'44444444'})
df['3'] = df['1'].map({2345: '2222222222'})
df['4'] = df['1'].map({2345: '3333333333', 6789: '555555555'})
print(df)
df_final = pd.DataFrame([[1234, 'a', 'b', 'c', 'd'],
[2345, '1111111111', '2222222222', '3333333333', np.nan],
[2345, '1111111111', '2222222222', '3333333333', np.nan],
[6789, '44444444', 'asd', '555555555', 'v']],
columns=['1', '2', '3', '4', '5'])
Спасибо заранее всем откликнувшимся.
Ответы (2 шт):
Автор решения: Nonen_Hook
→ Ссылка
Проблема в том, что map() изменяются значения всего столбца, а не только значения, соответствующие указанному условию. Вы можете использовать where() метод в сочетании map(), чтобы изменять только те значения, которые соответствуют указанному условию.
Вот как вы могли бы исправить свой код:
import pandas as pd
import numpy as np
df = pd.DataFrame([[1234, 'a', 'b', 'c', 'd'],
[[2345, np.nan, np.nan, 'f', np.nan],
[2345, np.nan, np.nan, 'g', np.nan],
[6789, 's', 'asd', 'g', 'v']],
columns=['1', '2', '3', '4', '5'])
df['2'] = df['1'].where(df['1'].isin([2345, 6789]), df['1'].map({2345: '1111111111', 6789:'44444444'}))
df['3'] = df['1'].where(df['1'] == 2345, df['1'].map({2345: '2222222222'}))
df['4'] = df['1'].where(df['1'].isin([2345, 6789]), df['1'].map({2345: '3333333333', 6789: '555555555'}))
print(df)
Автор решения: Алексей Р
→ Ссылка
for k, v in {'2': {2345: '1111111111', 6789: '44444444'}, '3': {2345: '2222222222'},
'4': {2345: '3333333333', 6789: '555555555'}}.items():
df.loc[idx, k] = df.loc[(idx := df['1'].isin(v.keys())), '1'].replace(v)
print(df)
1 2 3 4 5
0 1234 a b c d
1 2345 1111111111 2222222222 3333333333 NaN
2 2345 1111111111 2222222222 3333333333 NaN
3 6789 44444444 asd 555555555 v