如何在Python中对数据帧中的分类变量(系列)进行编码?
我有一本以下形式的词典:如何在Python中对数据帧中的分类变量(系列)进行编码?,python,join,dictionary,merge,pandas,Python,Join,Dictionary,Merge,Pandas,我有一本以下形式的词典: {CA: California, NV: Nevada, TX: Texas} 我想转换我的数据帧 { 'state':['California', 'California, 'Texas', 'Nevada', 'Texas], 'var':[100,200,300,400, 500] } 进入 最好的方法是什么?如果您颠倒了dict中的键和值,则可以使用: 然后调用映射: df.state = df.state.map(new_map) 这假设您的密钥存在
{CA: California, NV: Nevada, TX: Texas}
我想转换我的数据帧
{
'state':['California', 'California, 'Texas', 'Nevada', 'Texas],
'var':[100,200,300,400, 500]
}
进入
最好的方法是什么?如果您颠倒了dict中的键和值,则可以使用: 然后调用映射:
df.state = df.state.map(new_map)
这假设您的密钥存在于地图中,如果不存在,您将引发keyrorm
因此,创建数据帧:
In [12]:
df = pd.DataFrame({
'state':['California', 'California', 'Texas', 'Nevada', 'Texas'],
'var':[100,200,300,400, 500]
})
df
Out[12]:
state var
0 California 100
1 California 200
2 Texas 300
3 Nevada 400
4 Texas 500
[5 rows x 2 columns]
你的格言:
my_dict = {'CA': 'California', 'NV': 'Nevada', 'TX': 'Texas'}
反转键和值
new_dict = dict(zip(my_dict.values(), my_dict.keys()))
现在调用map执行查找并将其分配回状态:
In [13]:
df.state = df.state.map(new_dict)
df
Out[13]:
state var
0 CA 100
1 CA 200
2 TX 300
3 NV 400
4 TX 500
[5 rows x 2 columns]
如果您担心某些值可能不存在,则可以在dict上使用get
,以便它处理键错误
,并将None
指定为值:
使用“纽约”设置新df
In [19]:
df = pd.DataFrame({
'state':['California', 'California', 'Texas', 'Nevada', 'Texas', 'New York'],
'var':[100,200,300,400, 500, 600]
})
df
Out[19]:
state var
0 California 100
1 California 200
2 Texas 300
3 Nevada 400
4 Texas 500
5 New York 600
[6 rows x 2 columns]
现在调用get
:
In [25]:
df.state = df.state.map(lambda x: new_dict.get(x))
df
Out[25]:
state var
0 CA 100
1 CA 200
2 TX 300
3 NV 400
4 TX 500
5 None 600
[6 rows x 2 columns]
我还有一些字典中没有的状态。如果应用map(),则新序列中的相应值将丢失。我是否可以指定我希望对字典中不存在的值应用标识函数,即保持不变?@P.Escondido因此,对于上面的例子,因为纽约不在字典中,您希望它保持不变,因为纽约是正确的吗?您可以创建一个执行映射查找的函数,如果没有键,则不执行任何操作,或者您可以过滤数据帧中要分配给的值,仅过滤dict中存在的值并转换这些值。完全正确!我该怎么做?@P.Escondido我的答案通过使用
get
来解决这个问题。
In [19]:
df = pd.DataFrame({
'state':['California', 'California', 'Texas', 'Nevada', 'Texas', 'New York'],
'var':[100,200,300,400, 500, 600]
})
df
Out[19]:
state var
0 California 100
1 California 200
2 Texas 300
3 Nevada 400
4 Texas 500
5 New York 600
[6 rows x 2 columns]
In [25]:
df.state = df.state.map(lambda x: new_dict.get(x))
df
Out[25]:
state var
0 CA 100
1 CA 200
2 TX 300
3 NV 400
4 TX 500
5 None 600
[6 rows x 2 columns]