Python 有没有更有效的方法将贴图应用于熊猫系列?
在我的数据框中有一列名为“State”。它包含美国各州的缩写。我有硬编码的地区,我想为每个州创建一个包含地区的新列 我使用了pd.Series.apply(),但是我想知道对于这种类型的映射是否有更好的实践。关于如何改进代码有什么建议吗 这是我目前有效的代码,但我只是对最佳实践的建议持开放态度Python 有没有更有效的方法将贴图应用于熊猫系列?,python,pandas,pandas-apply,Python,Pandas,Pandas Apply,在我的数据框中有一列名为“State”。它包含美国各州的缩写。我有硬编码的地区,我想为每个州创建一个包含地区的新列 我使用了pd.Series.apply(),但是我想知道对于这种类型的映射是否有更好的实践。关于如何改进代码有什么建议吗 这是我目前有效的代码,但我只是对最佳实践的建议持开放态度 def get_region(s, *regions): if s in regions[0]: return 'west' elif s in regions[1]:
def get_region(s, *regions):
if s in regions[0]:
return 'west'
elif s in regions[1]:
return 'midwest'
elif s in regions[2]:
return 'south'
elif s in regions[3]:
return 'northeast'
else:
return None
west = ['WA','OR','CA','ID','NV','MT','WY','UT','AZ','CO','NM']
midwest = ['ND','MN','WI','MI','SD','NE','KS','IA','MO','IL','IN','OH']
south = ['TX','OK','AR','LA','MS','TN','KY','AL','GA','FL','SC','NC','VA','WV','MD','DE']
northeast = ['PA','NJ','NY','CT','MA','RI','VT','NH','ME']
regions = [west,midwest,south,northeast]
full_df['Region'] = full_df['State'].apply(get_region, args=regions)
full_df['Region'].head(15)
Out:
0 west
1 midwest
2 south
3 south
4 midwest
5 west
6 south
7 south
8 west
9 midwest
10 south
11 northeast
12 northeast
13 west
14 west
Name: Region, dtype: object
您可以尝试创建dict并将其映射到列:
west_dict = {i:"west" for i in west}
midwest_dict = {i:"midwest" for i in midwest}
south_dict = {i:"south" for i in south}
northeast_dict = {i:"northeast" for i in northeast}
d = {**west_dict, **midwest_dict, **south_dict, **northeast_dict}
full_df['Region'] = full_df['State'].map(d)
查看地图
map
s=pd.DataFrame([west,midwest,south,northeast],index=['west','midwest','south','northeast'])
s=s.reset_index().melt('index')
full_df['Region'] = full_df['State'].map(dict(zip(s['value'],s['index'])))
你在寻找效率,因为它应该运行得更快?还是使用更少的代码?运行更快或更少的代码。我真的只是在寻找最佳的编码实践,我想这应该是运行速度更快和代码更少的组合。“更少的代码”!->“最佳实践”我在一行中使用了您所做的一切创建了d,并将其映射到了d,但您的答案更具可读性。非常感谢。伟大的是的,我是为了清晰起见,但总的来说,它肯定可以减少到更少的行。谢谢!非常有效,我现在知道了。melt()的作用!