第三种和希望的最后一种类型的问题如下所示。 基于this和this问题,我将如何创建计算并计算Pandas中的新列,其中输入是整数和范围,并输出一个字符串?使用Pandas和不同的输入和输出类型计算Python中的新列
这是我原来的定义,因为我在ArcPy中有它:
df_joined["Gef_Stufe"] = df_joined["StaokKlass", "nFK"].apply(Gefaehrdestufe)
,并与我的其他问题之一提到的方法:
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
我与。适用()尝试:
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 [ “StaokKlass”]列包括数字(整数)从1至6,然后被划分成各为0至36,至55等等(即df_joined [ “Gef_stufe”]
'in'不能用数组使用'isin':'df_joined [“nFK_Proz”]。isin(list(range(0,36)))' – EdChum
Get我这个错误'exceptions.TypeError:无效类型比较'。那么'86'部件呢?那些可以工作还是以另一种方式告诉Python“86和更高”? – Khaled
,应该工作,除非你的dtype不是数字,'df_joined.info()'显示什么? – EdChum