繁体   English   中英

根据多列中的行值创建新的数据框列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM