根据条件(使用熊猫)将值从一列复制到另一列

时间:2020-04-19 19:19:44

标签: python pandas dataframe

我有一个数据框,如下所示...

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

我的数据框仅显示“ SOI_Final”的NaN,而未获取正确的值。我为这3个月中的每个月创建了一个布尔列,并且仅在bool值为“ True”时才应复制正确的月度值。有人对我在这里可能会缺少什么有任何建议吗?

谢谢, 杰夫

1 个答案:

答案 0 :(得分:0)

这里的问题是,每个布尔列(即df_merged['JUN_bool']都是串联的),因此is运算符的比较将永远不会只返回True,因此将所有值都指定为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)

对months列和布尔值掩码进行修改:

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