2016-08-16 11 views
1

私は以下のようなデータフレームを持っています。パンダでこのロジックを扱う方法

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

df ['country']には、さまざまな国名が表示されます。

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

しかし、私はこのロジックを達成する方法がわからない:私は、フラグはあなたが結果が見ることができる同じlogic.Soで2として、1のような第2の最初に表示され、国を設定したいですPython。ありがとうございました。 また、結果のデータフレームを取得するときに、データフレームを元のデータフレームに戻す機能が必要です。

あなたが factorizeを使用して 1を追加することができます

答えて

3

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

関連する問題