【发布时间】:2022-01-01 22:13:43
【问题描述】:
我正在研究 Kaggle Titanic 问题。我有一个功能,可以根据乘客的特征创建生存方式的叉积。对于 Embarked 的 SibSp,我得到以下生存表:
import pandas as pd
import numpy as np
data = [[0.5,0.657,0.75, np.NaN, np.NaN, np.NaN, np.NaN,0.556],
[0.372,0.375,0.667, np.NaN,0, np.NaN, np.NaN,0.362],
[0.302,0.438,0.375,0.364,0.3,0,0,0.336],
[0.343,0.506,0.478,0.364,0.214,0,0,0.377]]
df_m = pd.DataFrame(data, columns=[0,1,2,3,4,5,8,'All'],
index = ['C', 'Q', 'A', 'All'])
所以我开始的转置是:
Embarked C Q S All
SibSp
0 0.500000 0.372093 0.302115 0.342920
1 0.657143 0.375000 0.468468 0.506494
2 0.750000 0.666667 0.375000 0.478261
3 NaN NaN 0.363636 0.363636
4 NaN 0.000000 0.300000 0.214286
5 NaN NaN 0.000000 0.000000
8 NaN NaN 0.000000 0.000000
All 0.555556 0.362069 0.336049 0.376877
虽然我想要的端点是这样的:
Embarked C Q S All
SibSp
0 0.500000 0.372093 0.302115 0.342920
1 0.657143 0.375000 0.468468 0.506494
2 0.750000 0.666667 0.375000 0.478261
3 NaN NaN 0.363636 0.363636
4 NaN 0.000100 0.300000 0.214286
5 NaN NaN 0.000100 0.000100
8 NaN NaN 0.000100 0.000100
All 0.555556 0.362069 0.336049 0.376877
我想将速率严格限制在 0 和 1 之间,同时保留 NaN。我尝试了两种循环方式:
for i in df_m.columns:
for j in df_m.index:
p_hat.at[i, j] = max(min(df_m[i, j], 0.999), 0.001)
并将最后一行中的“.at”替换为“.loc”。这两种方法都从第一列和索引中抛出 KeyError: (0, 'C')。
我采用的另一种方法是连接并取 max(value, .001) 和 min(value, .999):
smalls = pd.DataFrame(0.001*np.ones(df_m.shape))
bigs = pd.DataFrame(0.999*np.ones(df_m.shape))
smalls.columns = df_m.columns
bigs.columns = df_m.columns
smalls.index = df_m.index
bigs.index = df_m.index
p_hat1 = pd.concat([df_m, bigs]).groupby(level=0).min()
p_hat = pd.concat([p_hat1, smalls]).groupby(level=0).max()
这具有将 NaN 转换为 0.999 的副作用。 在稍后的步骤中,我想结合比率和计数并计算 95% 的置信区间以进行绘图。在那个阶段,我不想显示 NaN。
提前致谢。
【问题讨论】:
-
转置和你想要的有什么区别?对我来说,它们看起来像相同的数据框......
-
哦,唯一的区别是将 0.0001 添加到 0 的单元格吗?
-
本例中没有显示,但我也将 1.0 的值替换为 0.999
标签: python-3.x pandas dataframe pandas-groupby