我有一个数据框,如下所示...
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”时才应复制正确的月度值。有人对我在这里可能会缺少什么有任何建议吗?
谢谢, 杰夫
答案 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