2016-08-16 58 views
1

我有一個如下所示的數據框。如何在熊貓中處理這個邏輯

coutry  flag 
0 China  red 
1 Russia  green 
2 China  yellow 
3 Britain  yellow 
4 Russia  green 
...................... 

在df ['country']中,您可以看到許多不同的國家/地區名稱。我想設置的第一次出現國爲1,第二個爲2的標誌是一樣的logic.So你可以看到的結果是:

coutry  flag 
0 1   1 
1 2   2 
2 1   3 
3 3   3 
4 2   2 

但我不知道該如何實現這個邏輯蟒蛇。謝謝。 此外,當我得到結果數據框時,我想有一個功能可以將數據框返回到原始數據框。

回答

3

您可以使用factorize並添加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 

然後你就可以通過Categorical列轉換爲categories如果需要保存記憶:

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 

#1000 times larger df 
df = pd.concat([df]*1000).reset_index(drop=True) 
df['coutry'] = pd.Categorical(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 
5   1  1 
6   2  2 
... 
... 

print (df['coutry'].nbytes) 
5024 

print (df['flag'].nbytes) 
20000 

如果需要轉換回,你可以map值通過字典:

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 
+0

我有一個qustion,當我得到的結果數據框,有沒有辦法恢復到原始數據幀 – Chauncey

+0

給我一個時間,請。 – jezrael

+0

我添加解決方案,請檢查它。 – jezrael