Python 数据帧-基于其他列指定1,0个值
我有一个包含国家名称的数据框&它们占能源产出的百分比。 我需要添加一个新的列,根据国家的能源产出是高于还是低于能源产出的中位数,为其指定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'] >
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提供了大量信息:)