我希望通过使用两列中的值逐行迭代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
方法。 apply
和applymap
以元素方式工作,而不是按行方式工作。最好的方法是什么?
答案 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()]