为bin创建新列是可行的,但在所有行中仅提供一个bin

问题描述

在这里疯了,因为无论我做什么,我都无法弄清楚哪里出了问题。

问题:

我有一个df。列之一是:Opnameduur。这是int64类型。

我的定义创建了一个名为Klasse的新列。这工作。但.... 根据在df.Opnameduur列中找到的值,该函数应该在新列df.Klasse的相应行中写入一个bin(dag,kort,middel,long(女巫是荷兰人的一天,short,middle,long))。

创建的列是df.Klasse,但是df.KLasse中的所有值都设置为:dag。

我就是不明白这里出了什么问题。...

df.Opnameduur.head()

给予:

0    1
1    1
2    9
3    1
4    3

因此,前两行应为:dag,在df.Klasse中,第三行应为:long。等

但是,我的def在整个新列df.Klasse中设置了'dag'。

我自己没看到它真是愚蠢。所以..我需要你的帮助!这是我的功能

def Klasse(df):
    for index,value in df.Opnameduur.items():
        if value == 1:
            df['Klasse'] = 'dag'
        elif value == 2:
            df['Klasse'] = 'kort'
        elif value == 3:
            df['Klasse'] = 'kort'
        elif value == 4:
            df['Klasse'] = 'middel'
        elif value == 5:
            df['Klasse'] = 'middel'
        elif value == 6:
            df['Klasse'] = 'middel'
        elif value >= 7:
            df['Klasse'] = 'lang'
        else:
            df['Klasse'] = 'onbekend'

我现在已经阅读了有关pandas.cut的文章,但是在深入探讨之前,我想用(如果...)相当简单的方式(如果不是的话)来理解我的错误

提前谢谢!!!问候Jan

解决方法

在进行df['Klasse'] == 'value'时,value被分配给整列,因为分配是向量化操作。您可以在熊猫中使用数据框的loc方法,并传递行和列的正确索引名称,以重新分配值,例如:

def Klasse(df):
    for index,value in df.Opnameduur.items():
        if value == 1:
            df.loc[index,'Klasse'] = 'dag'
        elif value == 2:
            df.loc[index,'Klasse'] = 'kort'
        elif value == 3:
            df.loc[index,'Klasse'] = 'kort'
        elif value == 4:
            df.loc[index,'Klasse'] = 'middel'
        elif value == 5:
            df.loc[index,'Klasse'] = 'middel'
        elif value == 6:
            df.loc[index,'Klasse'] = 'middel'
        elif value >= 7:
            df.loc[index,'Klasse'] = 'lang'
        else:
            df.loc[index,'Klasse'] = 'onbekend'