2017-09-15 120 views
2

我有一个数据框包含国家名称&其能源产出的百分比。 根据国家的能源产出是高于还是低于能源产出的中位数,我需要添加一个分配1或0的新列。有些哑代码:熊猫DataFrame - 基于其他列分配1,0值

import pandas as pd 
def answer(): 
    df = pd.DataFrame({'name':['china', 'america', 'canada'], 'output': [33.2, 15.0, 5.0]}) 
    df['newcol'] = df.where(df['output'] > df['output'].median(), 1, 0) 
    return df['newcol'] 
answer() 

代码返回ValueError异常:数通过2项的错误,安置意味着1

我觉得这是一个非常简单的解决方法,但我是新与大熊猫的工作。 请帮助结束我的沮丧

回答

1

@Vaishali解释了为什么pd.DataFrame.where没有按照您的预期工作,并建议您使用np.where来代替,这是非常好的建议。

我会提供你可以简单地将你的布尔结果转换为整数。

设置

df = pd.DataFrame({ 
    'name':['china', 'america', 'canada'], 
    'output': [33.2, 15.0, 5.0] 
}) 

选项1

df['newcol'] = (df['output'] > df['output'].median()).astype(int) 

选项2
或更快但通过使用基础numpy的阵列

o = df['output'].values 
df['newcol'] = (o > np.median(o)).astype(int) 
+0

嗯,总有 - 为什么我没有想到:) – Vaishali

+0

非常感谢!我曾尝试布尔掩码,但努力重新格式化返回的True | False值。我对熊猫非常陌生,我发现它很难学习所有的文档。你和@Vaishali已经非常翔实:) –

2

由于解决方案是矢量化的,您不需要循环。

df['newcol'] = np.where((df['output'] > df['output'].median()), 1, 0) 

    name output newcol 
0 china 33.2 1 
1 america 15.0 0 
2 canada 5.0  0 

对于传错的错误数量的项目,df.where与np.where有点不同。它返回与self相同形状的对象,其对应条目来自self,其中cond为True,否则为其他。因此,它返回一个数据框在您的案例中的两列而不是一系列,因此当您尝试将该数据框分配给一个系列时,您会收到错误消息。

+0

我一直想知道为什么其他职位使用np.where!所以基本上我在做的是将整个df传递给我的新系列,这就是为什么它会抛出一个错误? –

+0

当你需要输出是除boolean以外的任何数据类型时,np.where在if-else类型的场景中肯定非常有用。即使布尔值可以工作,但布尔掩码更好。是的,你正在将一个df传递到新系列中,从而导致错误。 (df ['output']> df ['output']。median(),1,0) – Vaishali

相关问题