[英]Creating a new conditional column in a dataframe with values from multiple columns
[英]Creating a new dataframe column based on row values from multiple columns
这是我在 StackOverflow 上的第一个问题,如果格式不完美,我深表歉意。
我已经连接了多个数据帧,现在我无法弄清楚如何创建一个新列 - df["population"] 基于其他列的值 - df["2013 pop"], df["2014 pop"]等等。例如,如果事件发生在 2014 年,即 df["Year"] == 2014,我想从 df["2014 pop"] 列中取出人口并将其插入新的 df["population “] 柱子。 我正在解释这个我知道的可怕的事情,我只是对我觉得我应该能够轻松完成的事情感到沮丧。 这是数据框的摘要以及到目前为止我尝试过的内容。
"Year" : [2013,2014,2015...],
"State" : ["Louisana", "Texas", "California"... ],
"City" : ["New Orleans", "Dallas", "Sacramento"...],
"Number Killed" : [4,6,2,4],
"Safety Grade" : ["A", "B", "C", "D"...],
"2013 Pop" : [421329, 232321, 2454543....],
"2014 Pop" : [454545, 655654, 3421342....],
"2015 Pop" : [142314, 454355, 4324323....],
"Incident Date(datetime dtype)" : [12-29-2014, 3-12-2017...]
}
df = pd.DataFrame(d)
我已经尝试过映射、定位、应用,但我找不到解决方案。 我认为我在使用条件定义函数方面走在了正确的轨道上,但我遇到了一个错误。
def categorise(row):
if row["Year"] == 2014:
return df["2014 Pop"]
elif row["Year"] == 2015:
return df["2015 Pop"]
elif row["Year"] == 2016:
return df["2016 Pop"]
elif row["Year"] == 2017:
return df["2017 Pop"]
else:
return "NONE"
当我尝试这个时:
df["Population"] = df.apply(lambda row : categorise(row), axis = 1)
我收到值错误“通过的项目数量错误 3609(df 的长度),位置意味着 1
有没有人根据我措辞不佳的问题对如何创建 df["Population"] 列提出建议?
您应该在categorise
函数中将df
更改为row
def categorise(row):
if row["Year"] == 2014:
return row["2014 Pop"]
elif row["Year"] == 2015:
return row["2015 Pop"]
elif row["Year"] == 2016:
return row["2016 Pop"]
elif row["Year"] == 2017:
return row["2017 Pop"]
else:
return "NONE"
df["Population"] = df.apply(categorise, axis = 1)
或使用np.select
df["Population"] = np.select(
[df["Year"] == 2014,
df["Year"] == 2015,
df["Year"] == 2016,
df["Year"] == 2017,
],
[df["2014 Pop"],
df["2015 Pop"],
df["2016 Pop"],
df["2017 Pop"],
],
default='NONE'
)
或使用pd.factorize
idx, cols = pd.factorize(df['Year'])
pop = df.filter(like='Pop').rename(columns=lambda x: int(x.split(' ')[0]))
out = pop.reindex(cols, axis=1).to_numpy()[np.arange(len(pop)), idx]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.