Копировать значение из одного столбца в другой на основе условия (используя pandas) - PullRequest
1 голос
/ 19 апреля 2020

У меня есть фрейм данных, как показано ниже ...

Month    JUN    JUL    AUG    SOI_Final    JUN_bool    JUL_bool    AUG_bool
Aug      1.2    0.8    0.1    NaN          False       False       True
Aug      0.2    0      -2     NaN          False       False       True
Jun      3.2    -2.5   0.6    NaN          True        False       False
Jul      2.2    -0.7   -0.8   NaN          False       True        False

Я пытаюсь сделать для каждой строки таблицы, посмотреть, какой месяц находится в столбце «Месяц», и назначить соответствующее значение от столбцов JUN, JUL или AUG до 'SOI_Final'. Например, если столбец «Месяц» равен «Июнь» для данной строки, то «SOI_Final» для этой строки получит значение из столбца «JUN». Вот код, который я получил до сих пор ...

df_merged['JUN_bool'] = (df_merged['Month'] == 'Jun')
df_merged['JUL_bool'] = (df_merged['Month'] == 'Jul')
df_merged['AUG_bool'] = (df_merged['Month'] == 'Aug')

if df_merged['JUN_bool'] is True:
    df_merged['SOI_Final']=df_merged['JUN']
elif df_merged['JUL_bool'] is True:
    df_merged['SOI_Final']=df_merged['JUL']
elif df_merged['AUG_bool'] is True:
    df_merged['SOI_Final']=df_merged['AUG']  
else:
    df_merged['SOI_Final']=np.NaN

Мой фрейм данных показывает только NaN для SOI_Final и не подбирает правильное значение. Я создал логический столбец для каждого из 3 месяцев, и правильное месячное значение следует копировать, только если значение bool равно «True». У кого-нибудь есть предложения по поводу того, чего мне здесь не хватает?

Спасибо, Джефф

1 Ответ

0 голосов
/ 20 апреля 2020

Проблема здесь в том, что каждый из столбцов bool, то есть df_merged['JUN_bool'], является последовательным, поэтому оператор сравнения is никогда не вернет просто True, поэтому evertyhing назначается как nan.

Если месяцы значения выровнены по столбцам, вы можете использовать заглавные буквы и использовать метод стека, только если индексы уникальны это пример трех месяцев:

np.random.seed(10)
months = np.random.choice(['Aug', 'Jun', 'Jul'], 100)
JUN = np.random.random(100)
JUL = np.random.random(100)
AUG = np.random.random(100)
index = [i for i in range(1900, 2000)]

data = pd.DataFrame(dict(months=months, JUN=JUN, JUL=JUL, AUG=AUG), index=index)

Выполните изменение столбца месяцев и логические маски:

data['months'] = data.months.str.upper()

df2 = data[['JUN', 'JUL', 'AUG']].stack(
    ).reset_index(level=1)

df2.rename(columns={0: 'month_value'}, inplace=True)

df2['months'] = data['months']
SOI = df2[df2['months'] == df2['level_1']].month_value
data['SOI'] = SOI

data.head(4)

#       months  JUN         JUL         AUG         SOI
# 1900  JUN     0.637952    0.933852    0.384843    0.637952
# 1901  JUN     0.372520    0.558900    0.820415    0.372520
# 1902  AUG     0.002407    0.672449    0.895022    0.895022
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...