为pandas dataframe创建新列的条件要求

时间:2017-03-09 15:46:12

标签: python python-3.x pandas

我有一个如下数据框:

if RainFall == 2:
    print("This summer has been a perfect summer, the plants have multiplied.")
    for Row in range(FIELDLENGTH):
        for Column in range(FIELDWIDTH):
            if Field[Row][Column] == PLANT:
                if Field[Row + 1][Column] != ROCKS:
                    Field[Row + 1][Column] = GOODSUMMER
                if Field[Row - 1][Column] != ROCKS:
                    Field[Row - 1][Column] = GOODSUMMER
                if Field[Row + 1][Column + 1] != ROCKS:
                    Field[Row + 1][Column + 1] = GOODSUMMER
                if Field[Row - 1][Column - 1] != ROCKS:
                    Field[Row - 1][Column - 1] = GOODSUMMER
                if Field[Row][Column + 1] != ROCKS:
                    Field[Row][Column + 1] = GOODSUMMER
                if Field[Row][Column - 1] != ROCKS:
                    Field[Row][Column - 1] = GOODSUMMER
                if Field[Row + 1][Column + 1] != ROCKS:
                    Field[Row + 1][Column - 1] = GOODSUMMER
                if Field[Row - 1][Column + 1] != ROCKS:
                    Field[Row - 1][Column + 1] = GOODSUMMER
                break

如何创建一个名为BossName的附加列,如下所示:

预期产出:

Name   IDNum      BossNum
John   1          0
Matt   2          1
Mike   3          2
Jack   4          1

我目前尝试过:

Name   IDNum      BossNum     BossName
John   1          0           John/none (I don't care about boss being ided)
Matt   2          1           John
Mike   3          2           Matt
Jack   4          1           John

这根本不起作用。关于如何实现这一点的任何想法都会很棒。

2 个答案:

答案 0 :(得分:6)

您可以创建一个索引为Name的系列IDNum,然后使用map

df['BossName'] = df.BossNum.map(df.set_index('IDNum').Name)
df

enter image description here

答案 1 :(得分:2)

Psidom已经为您提供了正确的答案,但同样值得一提的是,您可以明确地为map创建一个仅包含您需要的新系列。

df.BossNum.map(pd.Series(df.Name.values, index=df.IDNum))

这可能比为没有很多列的小型DataFrame设置索引要快一些,但对于包含许多其他列的较大DataFrame肯定会更快,因为当您设置索引时列数增加会产生一些额外成本在整个DataFrame上。