2016-09-27 46 views
1

第三种和希望的最后一种类型的问题如下所示。 基于thisthis问题,我将如何创建计算并计算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”]

+2

'in'不能用数组使用'isin':'df_joined [“nFK_Proz”]。isin(list(range(0,36)))' – EdChum

+0

Get我这个错误'exceptions.TypeError:无效类型比较'。那么'86'部件呢?那些可以工作还是以另一种方式告诉Python“86和更高”? – Khaled

+0

,应该工作,除非你的dtype不是数字,'df_joined.info()'显示什么? – EdChum

回答

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

+0

很高兴你解决了你的问题,记得在几天内接受它的时间问题是不是没有答案 – EdChum

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] 
+0

有趣的解决方案,但对我来说,相当Python初学者很不明白。我会仔细看看的。这是否意味着熊猫? – Khaled