将合并值转换为分类值

时间:2019-12-14 11:11:35

标签: python pandas data-science

我正在研究Titanic Dataset(Kaggle)竞赛。数据集中的一列是“票价”,其中包含浮点值。对于EDA,我已将“票价”列转换为垃圾箱,并为垃圾箱分配了标签。问题在于某些标签已分配给np.nan。

  Fare          1284 non-null float64

一些样本值:

  0     7.2500
  1    71.2833
  2     7.9250
  3    53.1000
  4     8.0500

当我使用qcut将“票价”列转换为垃圾箱时:

      dataset['FareBin'] = pd.qcut(dataset['Fare'], 4) 

输出:

      (-0.001, 7.896]      337
      (14.054, 30.071]     322
      (30.071, 512.329]    320
      (7.896, 14.054]      305

当我想为FareBin列分配标签时出现问题

       label1=[1,2,3,4]
       bin1=[-0.001,7.896,14.054,30.071,512.329]
       dataset['FareBin']=pd.cut(dataset['Fare'],bin1,labels=label1)

我不知道问题是什么。另外,如果有更好的方法,请告诉我。 感谢您抽出宝贵的时间来解决这个问题。

1 个答案:

答案 0 :(得分:0)

数据集中只有一个样本缺少票价(#1043)。

例如,

像这样执行,然后对值进行装箱:

display(df[df.fare.isna()])

age     cabin   embarked    fare    name    parch   passengerid     pclass  sex     sibsp   survived    ticket
1043    60.50000    cabin_unknown   S   nan     Storey, Mr. Thomas  0   1044    3   male    0   nan     3701

寻找类似的乘客:

filtered_df = df[(df.pclass == 3) & (df.embarked == "S") & (df.sex == "male") & (df.sibsp == 0) & 
                (df.parch == 0) & (df.age > 50) & (df.age < 70) & (~df.survived.isna())]

输出:

    age     cabin   embarked    fare    name    parch   passengerid     pclass  sex     sibsp   survived    ticket
94      59.00000    NaN     S   7.25000     Coxon, Mr. Daniel   0   95  3   male    0   0.00000     364500
152     55.50000    NaN     S   8.05000     Meo, Mr. Alfonzo    0   153     3   male    0   0.00000     A.5. 11206
222     51.00000    NaN     S   8.05000     Green, Mr. George Henry     0   223     3   male    0   0.00000     21440
326     61.00000    NaN     S   6.23750     Nysveen, Mr. Johan Hansen   0   327     3   male    0   0.00000     345364
406     51.00000    NaN     S   7.75000     Widegren, Mr. Carl/Charles Peter    0   407     3   male    0   0.00000     347064
631     51.00000    NaN     S   7.05420     Lundahl, Mr. Johan Svensson     0   632     3   male    0   0.00000     347743

填写缺失值:

df.fare.fillna(filtered_df.fare.mean(), inplace=True)

请注意,我已将数据集中的所有列名都小写。您需要相应地调整代码。