Python 数据帧-基于其他列指定1,0个值

Python 数据帧-基于其他列指定1,0个值,python,pandas,dataframe,series,calculated-columns,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'] >

我有一个包含国家名称的数据框&它们占能源产出的百分比。 我需要添加一个新的列,根据国家的能源产出是高于还是低于能源产出的中位数,为其指定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
还不熟悉。
请帮助结束我的沮丧

解决方案已矢量化,您不需要循环

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,否则来自other。因此,在您的案例中,它返回一个包含两列的数据帧,而不是一个系列,因此当您尝试将该数据帧分配给一个系列时,您会收到错误消息。

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

我会告诉你,你可以简单地把布尔结果转换成整数

设置

df = pd.DataFrame({
    'name':['china', 'america', 'canada'],
    'output': [33.2, 15.0, 5.0]
})
df['newcol'] = (df['output'] > df['output'].median()).astype(int)
选项1

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

选项2
或者通过使用底层的numpy数组更快

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

我一直在想为什么其他帖子都使用np.where!基本上,我所做的是将整个df传递到我的新系列中,这就是为什么它抛出了一个错误?np.where在if-else类型的场景中非常有用,当您需要输出为除布尔以外的任何数据类型时。即使对于布尔型,它也能工作,但布尔型掩蔽效果更好。是的,您将df传递到新系列中,因此出现了错误。您只需打印df就可以看到发生了什么。其中(df['output']>df['output'].median(),1,0)非常感谢!我曾尝试过布尔掩蔽,但正在努力重新格式化返回的真|假值。我对熊猫非常陌生,我发现学习所有的文档都很困难。您和@Vaishali提供了大量信息:)