第3个,希望这些问题的最后一种类型如下。 基于this和this问题,如何在Pandas中创建计算和计算新列,其中输入是整数和范围,输出是字符串?
这是我在ArcPY中的原始定义:
def Gefaehrdestufe(staok_klasse, nFK):
x = ""
if staok_klasse == 1:
if nFK in range(0, 36):
x = "Geringes Risiko"
elif nFK in range(36, 51):
x = "Geringes Risiko"
elif nFK in range (51, 66):
x = "Geringes Risiko"
elif nFK in range(66, 86):
x = "Gering bis mäßig"
elif nFK >= 86:
x = "Mäßig"
elif staok_klasse == 2:
if nFK in range(0, 36):
x = "Geringes Risiko"
elif nFK in range(36, 51):
x = u"Gering bis mäßig"
elif nFK in range (51, 66):
x = u"Gering bis mäßig"
elif nFK in range(66, 86):
x = u"Mäßig"
elif nFK >= 86:
x = u"Mäßig hoch"
return x
我尝试过.apply():
df_joined["Gef_Stufe"] = df_joined["StaokKlass", "nFK"].apply(Gefaehrdestufe)
并使用我在其他一个问题中提到的方法:
st_1_nfk_0_36 = (df_joined["StaokKlass"] == "1") & (df_joined["nFK_Proz"] in range(0,36))
st_1_nfk_36_51 = (df_joined["StaokKlass"] == "1") & (df_joined["nFK_Proz"] in range(36, 51))
st_1_nfk_51_66 = (df_joined["StaokKlass"] == "1") & (df_joined["nFK_Proz"] in range(51, 66))
st_1_nfk_66_85 = (df_joined["StaokKlass"] == "1") & (df_joined["nFK_Proz"] in range(66, 85))
st_1_nfk_85_x = (df_joined["StaokKlass"] == "1") & (df_joined["nFK_Proz"] >= 86)
df_joined.loc[st_1_nfk_0_36, "Gef_stufe"] = "Geringes Risiko"
df_joined.loc[st_1_nfk_36_51, "Gef_stufe"] = "Geringes Risiko"
df_joined.loc[st_1_nfk_51_66, "Gef_stufe"] = "Geringes Risiko"
df_joined.loc[st_1_nfk_66_85, "Gef_stufe"] = u"Gering bis mäßig"
df_joined.loc[st_1_nfk_85_x, "Gef_stufe"] = u"Mäßig"
也有这种风格:
st_1_nfk_0_36 = (df_joined["StaokKlass"] == "1") & (df_joined["nFK_Proz"] > 0) & (df_joined["nFK_Proz"] < 36)
但都没有效果。
修改
所以我已将我的代码更新为@EdChum的建议,但我一直收到此错误:exceptions.TypeError: invalid type comparison
。
现在出于测试目的,我已将条件的前半部分取出(df_joined["StaokKlass"] == "1")
并且代码没有错误地运行,但是它没有给我所需的(或任何)输出。所以问题肯定在这部分,但我无法弄清楚为什么。我试过有和没有括号但每次都出现同样的错误。
df_joined.info()
确认列df_joined["Staokklass"]
是整数,nFK是浮点数。
st_1_nfk_0_36 = (df_joined["StaokKlass"] == "1") & (df_joined["nFK_Proz"].isin(list(range(0,36))))
st_1_nfk_36_51 = (df_joined["StaokKlass"] == "1") & (df_joined["nFK_Proz"].isin(list(range(36, 51))))
st_1_nfk_51_66 = (df_joined["StaokKlass"] == "1") & (df_joined["nFK_Proz"].isin(list(range(51, 66))))
st_1_nfk_66_85 = (df_joined["StaokKlass"] == "1") & (df_joined["nFK_Proz"].isin(list(range(66, 85))))
& (df_joined["nFK_Proz"].isin(list(range(86,1000))))
df_joined.loc[st_1_nfk_0_36, "Gef_stufe"] = "Geringes Risiko"
df_joined.loc[st_1_nfk_36_51, "Gef_stufe"] = "Geringes Risiko"
df_joined.loc[st_1_nfk_51_66, "Gef_stufe"] = "Geringes Risiko"
df_joined.loc[st_1_nfk_66_85, "Gef_stufe"] = u"Gering bis mäßig"
df_joined.loc[st_1_nfk_85_x, "Gef_stufe"] = u"Mäßig"
问题1:我如何改变第一个被接受的条件
问题2:我希望Python为我创建一个新的列df_joined[Gef_Stufe]
,它具有字符串声明(最好带有unicode字符)。
还有一件事:我希望最后一个条件类似于>= 86
而不是range(0, 1000)
,而这样可以完成工作,因为范围永远不会那么高。但出于好奇和学习目的(以及干净的代码),我想知道如何实现这一目标。
编辑2:
这里是df_joined.info()和df_joined.dtypes的输出:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 63117 entries, 0 to 63116
Data columns (total 38 columns):
OBJECTID 63117 non-null int64
FORSTAMT 63117 non-null int64
REVIER 63117 non-null int64
ABTEILUNG 63117 non-null int64
LAND 63117 non-null object
VEG 63117 non-null int64
Ortsname 63117 non-null object
DWD_ID 63117 non-null object
ForstortID 63117 non-null object
nFK_staok 63117 non-null int64
Wald_Typ 63117 non-null object
Datum 63117 non-null datetime64[ns]
nFK 63117 non-null int64
NS 63117 non-null int64
NV 63117 non-null float64
NS_Prog_1 63117 non-null int64
NS_Prog_2 63117 non-null int64
NS_Prog_3 63117 non-null int64
FET 63117 non-null int64
NS_Cap 63117 non-null int64
NS_Cap_P1 63117 non-null int64
NS_Cap_P2 63117 non-null int64
NS_Cap_P3 63117 non-null int64
Monat 63117 non-null object
Saison 63117 non-null object
IVbest 63117 non-null float64
NVbest 63117 non-null float64
nFK_140 63117 non-null float64
NV_Prog_1 63117 non-null float64
NV_Prog_2 63117 non-null float64
NV_Prog_3 63117 non-null float64
IV_Prog_1 63117 non-null float64
IV_Prog_2 63117 non-null float64
IV_Prog_3 63117 non-null float64
nFK_Prog 63117 non-null float64
nFK_ges 63117 non-null float64
nFK_Proz 63117 non-null float64
StaokKlass 63117 non-null int64
dtypes: datetime64[ns](1), float64(13), int64(17), object(7)
memory usage: 17.1+ MB
df_joined [&#34; StaokKlass&#34;]列由1到6的数字(整数)组成,然后分为0到36到55之间的每个范围,依此类推(即df_joined [&#] 34; Gef_stufe&#34;]
答案 0 :(得分:1)
找到解决方案!在条件的第一个表达中,问题是一个错误的括号。
我有st_1_nfk_0_36 = (df_joined["StaokKlass"]) == 1 & (df_joined["nFK_Proz"].between(0,36))
应该是什么时候
st_1_nfk_0_36 = (df_joined["StaokKlass"] == 1) & (df_joined["nFK_Proz"].between(0,36))
所以现在它工作正常,我得到了我想要的输出!非常感谢!希望最后一栏没有问题:-D
答案 1 :(得分:0)
选项1
data = {
1: [
(u'Geringes Risiko', 66),
(u'Gering bis mäßig', 86),
(u'Mäßig',),
],
2: [
(u'Geringes Risiko', 51),
(u'Gering bis mäßig', 66),
(u'Mäßig', 86),
(u'Mäßig hoch',),
],
}
def Gefaehrdestufe(staok_klasse, nFK):
for group in data[staok_klasse][:-1]:
if nFK < group[1]:
return group[0]
return data[staok_klasse][-1][0]