条件 pandas 的逐列均值
Column wise mean with condition pandas
我有一个示例数据框如下:
data = pd.DataFrame({'Date':[20210101,20210102,20210103,20210104,20210105],'coef1':[1,2,5,4,3],'coef2':[1,1,2,6,3],'coef3':[1,1,1,1,1]})
如果这些值不等于 1,我想对 'coef1'、'coef2' 和 'coef3' 取平均值。
我想要的数据框应该如下所示:
我写了一个函数并将其应用到我的 datframe 上并得到了我想要的输出,但是我想要一个 pythonic 的方式来实现这个。
def final_coef(x):
coef_list = []
if x['coef1'] == 1:
pass
else:
coef_list.append(x['coef1'])
if x['coef2'] == 1:
pass
else:
coef_list.append(x['coef2'])
if x['coef3'] == 1:
pass
else:
coef_list.append(x['coef3'])
return np.mean(coef_list)
data['Final_coef'] = data.apply(lambda row: final_coef(row),axis = 1)
这可以在一行中完成,但需要执行三个步骤:
- 在任何值等于
1
的地方应用 np.nan
使用 df.where(df.ne(1), np.nan)
- 使用
df[['coef1', 'coef2', 'coef3']].mean(axis=1))
计算每行的平均值(NaNs
不包括在内)
- 使用
df.assign()
将此计算结果分配给新列
代码示例
df = df.assign(final_coef=df.where(df.ne(1), np.nan)[['coef1', 'coef2', 'coef3']].mean(axis=1))
>>>df
Date coef1 coef2 coef3 final_coef
0 20210101 1 1 1 NaN
1 20210102 2 1 1 2.0
2 20210103 5 2 1 3.5
3 20210104 4 6 1 5.0
4 20210105 3 3 1 3.0
data['final_coef'] = (
data[['coef1', 'coef2', 'coef3']][data[['coef1', 'coef2', 'coef3']] != 1]
.mean(axis=1)
)
data
Date coef1 coef2 coef3 final_coef
0 20210101 1 1 1 NaN
1 20210102 2 1 1 2.0
2 20210103 5 2 1 3.5
3 20210104 4 6 1 5.0
4 20210105 3 3 1 3.0
解释:
这将生成所需的掩码。请注意,Date
字段不需要考虑
data[['coef1', 'coef2', 'coef3']] != 1
coef1 coef2 coef3
0 False False False
1 True False False
2 True True False
3 True True False
4 True True False
那么您可以通过以下方式获取所需的对应数据点:
data[['coef1', 'coef2', 'coef3']][data[['coef1', 'coef2', 'coef3']] != 1]
coef1 coef2 coef3
0 NaN NaN NaN
1 2.0 NaN NaN
2 5.0 2.0 NaN
3 4.0 6.0 NaN
4 3.0 3.0 NaN
我有一个示例数据框如下:
data = pd.DataFrame({'Date':[20210101,20210102,20210103,20210104,20210105],'coef1':[1,2,5,4,3],'coef2':[1,1,2,6,3],'coef3':[1,1,1,1,1]})
如果这些值不等于 1,我想对 'coef1'、'coef2' 和 'coef3' 取平均值。
我想要的数据框应该如下所示:
我写了一个函数并将其应用到我的 datframe 上并得到了我想要的输出,但是我想要一个 pythonic 的方式来实现这个。
def final_coef(x):
coef_list = []
if x['coef1'] == 1:
pass
else:
coef_list.append(x['coef1'])
if x['coef2'] == 1:
pass
else:
coef_list.append(x['coef2'])
if x['coef3'] == 1:
pass
else:
coef_list.append(x['coef3'])
return np.mean(coef_list)
data['Final_coef'] = data.apply(lambda row: final_coef(row),axis = 1)
这可以在一行中完成,但需要执行三个步骤:
- 在任何值等于
1
的地方应用np.nan
使用df.where(df.ne(1), np.nan)
- 使用
df[['coef1', 'coef2', 'coef3']].mean(axis=1))
计算每行的平均值( - 使用
df.assign()
将此计算结果分配给新列
NaNs
不包括在内)
代码示例
df = df.assign(final_coef=df.where(df.ne(1), np.nan)[['coef1', 'coef2', 'coef3']].mean(axis=1))
>>>df
Date coef1 coef2 coef3 final_coef
0 20210101 1 1 1 NaN
1 20210102 2 1 1 2.0
2 20210103 5 2 1 3.5
3 20210104 4 6 1 5.0
4 20210105 3 3 1 3.0
data['final_coef'] = (
data[['coef1', 'coef2', 'coef3']][data[['coef1', 'coef2', 'coef3']] != 1]
.mean(axis=1)
)
data
Date coef1 coef2 coef3 final_coef
0 20210101 1 1 1 NaN
1 20210102 2 1 1 2.0
2 20210103 5 2 1 3.5
3 20210104 4 6 1 5.0
4 20210105 3 3 1 3.0
解释:
这将生成所需的掩码。请注意,Date
字段不需要考虑
data[['coef1', 'coef2', 'coef3']] != 1
coef1 coef2 coef3
0 False False False
1 True False False
2 True True False
3 True True False
4 True True False
那么您可以通过以下方式获取所需的对应数据点:
data[['coef1', 'coef2', 'coef3']][data[['coef1', 'coef2', 'coef3']] != 1]
coef1 coef2 coef3
0 NaN NaN NaN
1 2.0 NaN NaN
2 5.0 2.0 NaN
3 4.0 6.0 NaN
4 3.0 3.0 NaN