Python 如何处理熊猫的这种逻辑

Python 如何处理熊猫的这种逻辑,python,pandas,dataframe,categorical-data,Python,Pandas,Dataframe,Categorical Data,我有一个如下所示的数据框 coutry flag 0 China red 1 Russia green 2 China yellow 3 Britain yellow 4 Russia green ...................... 在df['country']中,您可以看到许多不同的国家名称。我想将第一个国家设置为1,第二个设置为2。标志是相同的逻辑。因此您可以看到结果是: coutry fl

我有一个如下所示的数据框

   coutry      flag
0  China       red
1  Russia      green
2  China       yellow
3  Britain     yellow
4  Russia      green
......................
在df['country']中,您可以看到许多不同的国家名称。我想将第一个国家设置为1,第二个设置为2。标志是相同的逻辑。因此您可以看到结果是:

 coutry      flag
0  1          1
1  2          2
2  1          3
3  3          3
4  2          2
但我不知道如何在python中实现这种逻辑。谢谢您。 此外,当我得到结果数据帧时,我希望有一个函数将数据帧恢复到原始状态。

您可以使用并添加
1

df['coutry'] = pd.factorize(df.coutry)[0] + 1
df['flag'] = pd.factorize(df.flag)[0] + 1
print (df)
   coutry  flag
0       1     1
1       2     2
2       1     3
3       3     3
4       2     2
然后,如果需要节省内存,您可以将列转换为
类别

df['coutry'] = pd.Categorical(pd.factorize(df.coutry)[0] + 1)
df['flag'] =  pd.Categorical(pd.factorize(df.flag)[0] + 1)
print (df)
  coutry flag
0      1    1
1      2    2
2      1    3
3      3    3
4      2    2
print (df.dtypes)
coutry    category
flag      category
dtype: object

如果需要转换回,您可以使用字典:

b = [list(x) for x in pd.factorize(df.coutry.drop_duplicates())]
d1 = dict(zip(b[0], b[1]))
print (d1)
{0: 'China', 1: 'Russia', 2: 'Britain'}

b = [list(x) for x in pd.factorize(df.flag.drop_duplicates())]
d2 = dict(zip(b[0], b[1]))
print (d2)
{0: 'red', 1: 'green', 2: 'yellow'}


df['coutry'] =  pd.Categorical(pd.factorize(df.coutry)[0])
df['flag'] =  pd.Categorical(pd.factorize(df.flag)[0])
print (df)
   coutry  flag
0       0     0
1       1     1
2       0     2
3       2     2
4       1     1

df['coutry'] = df.coutry.map(d1)
df['flag'] = df.flag.map(d2)
print (df)
    coutry    flag
0    China     red
1   Russia   green
2    China  yellow
3  Britain  yellow
4   Russia   green
b = [list(x) for x in pd.factorize(df.coutry.drop_duplicates())]
d1 = dict(zip(b[0], b[1]))
print (d1)
{0: 'China', 1: 'Russia', 2: 'Britain'}

b = [list(x) for x in pd.factorize(df.flag.drop_duplicates())]
d2 = dict(zip(b[0], b[1]))
print (d2)
{0: 'red', 1: 'green', 2: 'yellow'}


df['coutry'] =  pd.Categorical(pd.factorize(df.coutry)[0])
df['flag'] =  pd.Categorical(pd.factorize(df.flag)[0])
print (df)
   coutry  flag
0       0     0
1       1     1
2       0     2
3       2     2
4       1     1

df['coutry'] = df.coutry.map(d1)
df['flag'] = df.flag.map(d2)
print (df)
    coutry    flag
0    China     red
1   Russia   green
2    China  yellow
3  Britain  yellow
4   Russia   green