Pandas函数用于从数据框

时间:2016-05-01 17:54:05

标签: python pandas

我希望通过使用两列中的值逐行迭代Series来生成DataFrame。像这样:

race_cats = ('White', 'Black', 'Hispanic', 'Other')
def raceParse(row):
    if row.hispan != 'Not Hispanic':
        return 'Hispanic'
    elif row.race == 'White':
        return 'White'
    elif row.race == 'Black/Negro':
        return 'Black'
    else:
        return 'Other'
df['race4'] = df.map(lambda r: raceParse(r)).astype('category', ordered=False, categories=race_cats)

这显然不起作用,因为DataFrame没有map方法。 applyapplymap以元素方式工作,而不是按行方式工作。最好的方法是什么?

1 个答案:

答案 0 :(得分:3)

您可以使用loc获得所需的结果,如下所示:

# Sample data.
df = pd.DataFrame({'hispan': ['Not Hispanic', 'Not Hispanic', 'Hispanic'], 'race': ['White', 'Black', 'Other']})

>>> df
         hispan   race
0  Not Hispanic  White
1  Not Hispanic  Black
2      Hispanic  Other

df['race4'] = 'Other'
df.loc[df.race == 'Black', 'race4'] = 'Black'
df.loc[df.race == 'White', 'race4'] = 'White'
df.loc[~df.hispan.isin(['Not Hispanic']), 'race4'] = 'Hispanic'

>>> df
         hispan   race     race4
0  Not Hispanic  White     White
1  Not Hispanic  Black     Black
2      Hispanic  Other  Hispanic

如果符合您的要求,您可以将列转换为分类:

df['race4'] = pd.Categorical(df.race4, categories=['White', 'Black', 'Hispanic', 'Other'])

请注意loc作业的顺序很重要。它相当于您的if row.hispan != 'Not Hispanic': ... elif结构。通过最后一次对西班牙语进行测试,它优先于race列。

我相信上面的答案就是你想要的。就您的要求而言,有iterrows方法:

def race_parse(row):
    if row.hispan != 'Not Hispanic':
        return 'Hispanic'
    elif row.race == 'White':
        return 'White'
    elif row.race == 'Black/Negro':
        return 'Black'
    else:
        return 'Other'

df['race4'] = [race_parse(row) for _, row in df.iterrows()]