【问题标题】:How to categorize floating values in python using pandas library如何使用 pandas 库在 python 中对浮点值进行分类
【发布时间】:2016-10-10 00:05:55
【问题描述】:

` 导入熊猫 导入numpy

#importing the dataset
data=pandas.read_csv('gapminder.csv',low_memory=False)

#setting variables to be worked with to numeric
data['urbanrate']=data['urbanrate'].convert_objects(convert_numeric=True)
data['femaleemployrate']=data['femaleemployrate'].convert_objects(convert_numeric=True)
data['lifeexpectancy']=data['lifeexpectancy'].convert_objects(convert_numeric=True)

print("Count for urbanrate")
chk8=data['urbanrate'].value_counts(sort=False,dropna=False)
print(chk8)

sub1=data[['urbanrate','femaleemployrate','lifeexpectancy']]
print (sub1.head(25))

===========================================================================
def urban (row):
      if (row['urbanrate']<25.0):
          return 1
      if (data[['urbanrate']>=25.0 & data['urbanrate']<75.0]):
         return 2
      if (data['urbanrate']>75.0):
         return 3
sub1['urban']=sub1.apply(lambda row: urban (row),axis=1)
print (sub1.head(25))
============================================================================`

我想将urbanrate 的所有值(都是浮点数,如24.5688.9877.65)分为 3 个不同的类别(一个是 &lt;25 的值,另一个是 @ 987654327@ 和&gt;=75 的最后一个)并将这些值存储在一个新变量中(比如urban)。我怎样才能做到这一点?我已经给出了我的代码。我执行了它,它给了我错误:

TypeError: ('无法将 dtyped [float64] 数组与 [bool] 类型的标量进行比较', '发生在索引 1'))

请帮帮我

【问题讨论】:

    标签: python numpy pandas categories data-analysis


    【解决方案1】:

    我觉得你可以用pd.cut:

    import pandas as pd
    
    df = pd.DataFrame({'urbanrate':[10,20,25,30,40,75,80,100]})
    print (df)
       urbanrate
    0         10
    1         20
    2         25
    3         30
    4         40
    5         75
    6         80
    7        100
    
    bins = [0, 24.999, 74.999, 1000]
    group_names = [1,2,3]
    df['urban'] = pd.cut(df['urbanrate'], bins, labels=group_names)
    print (df)
       urbanrate urban
    0         10     1
    1         20     1
    2         25     2
    3         30     2
    4         40     2
    5         75     3
    6         80     3
    7        100     3
    

    【讨论】:

      【解决方案2】:

      使用 3 个面具:

      sub1.loc[sub1['urbanrate']<25.0,'urban'] = 1
      sub1.loc[(sub1['urbanrate']>=25.0) & (sub1['urbanrate']<75.0),'urban'] = 2
      sub1.loc[sub1['urbanrate']>75.0,'urban'] = 3
      

      您可以屏蔽满足布尔条件的行并以矢量化方式设置所有行,但您尝试失败的原因是:

      if (data[['urbanrate']>=25.0 & data['urbanrate']<75.0]):
          return 2
      

      在这里,您尝试将数组与标量值进行比较以生成标量布尔值,这不起作用,此外,尽管您使用了正确的运算符,但您需要将条件括在括号中 ()

      if (data[['urbanrate']>=25.0) & (data['urbanrate']<75.0]):
          return 2
      

      你的函数也不一致,你调用了apply并传递了axis=1,这意味着你正在尝试对行值进行操作并且你的第一个条件很好:

      if (row['urbanrate']<25.0):
                return 1
      

      但在随后的条件下,您正在测试整个 Series,这是完全不同的

      如果您执行以下操作,它会起作用:

      def urban (colData):
          if colData<25.0:
              return 1
          if (colData>=25.0) & (colData<75.0]):
             return 2
          if (colData>75.0):
             return 3
      sub1['urban']=sub1['urbanrate'].apply(urban)
      

      这里不需要逐行操作,您可以将整个列/系列作为 arg 传递给您的函数

      【讨论】:

      • sub1['urban']=sub1['urban'].apply(urban) 现在它在这一行显示错误为 KeyError:urban。我无法弄清楚。
      • 嗯,试试sub1['urban']=sub1['urbanrate'].apply(urban)
      猜你喜欢
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 2020-01-11
      • 2017-12-29
      相关资源
      最近更新 更多