Pandas DataFrame - 根据其他列分配1,0个值

时间:2017-09-15 01:15:10

标签: python pandas dataframe series calculated-columns

我有一个包含国家/地区名称的数据框。他们的能量输出百分比。 我需要根据国家的能源产出是高于还是低于能源产出的中位数,添加一个新的列,分配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

我觉得这是一个非常简单的修复,但我是Pandas的新手。 请帮助结束我的沮丧

2 个答案:

答案 0 :(得分: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,否则来自其他。所以它在你的情况下返回一个数据帧有两列而不是一个系列,因此当你尝试将该数据帧分配给一个系列时,你会得到错误信息。

答案 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)