Pandas DataFrame - 根据其他列分配 1,0 值
Pandas DataFrame - assign 1,0 values based on other column
我有一个包含国家名称及其能源输出百分比的数据框。
我需要添加一个新列,根据该国家/地区的能源输出是高于还是低于能源输出的中位数来分配 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()
代码returns
ValueError: Wrong number of items passed 2, placement implies 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 的工作方式略有不同。它 Returns 一个与 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]
})
选项 1
df['newcol'] = (df['output'] > df['output'].median()).astype(int)
选项 2
或者通过使用底层的 numpy 数组
更快
o = df['output'].values
df['newcol'] = (o > np.median(o)).astype(int)
我有一个包含国家名称及其能源输出百分比的数据框。 我需要添加一个新列,根据该国家/地区的能源输出是高于还是低于能源输出的中位数来分配 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()
代码returns
ValueError: Wrong number of items passed 2, placement implies 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 的工作方式略有不同。它 Returns 一个与 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]
})
选项 1
df['newcol'] = (df['output'] > df['output'].median()).astype(int)
选项 2
或者通过使用底层的 numpy 数组
o = df['output'].values
df['newcol'] = (o > np.median(o)).astype(int)