使用Pandas和不同的输入和输出类型在Python中计算新列

时间:2016-09-27 14:39:48

标签: python-2.7 pandas

第3个,希望这些问题的最后一种类型如下。 基于thisthis问题,如何在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;]

2 个答案:

答案 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]