2017-01-01 53 views
1

我們有兩個數據集,其中一個變量col1。 第二個數據中缺少一些等級。例如,讓保持兩個數據之間的分解相同

import pandas as pd 
df1 = pd.DataFrame({'col1':["A","A","B","C","D","E"]}) 
df2 = pd.DataFrame({'col1':["A","B","D","E"]}) 

當我們因式分解DF1

df1["f_col1"]= pd.factorize(df1.col1)[0] 
df1 

我們得到了

col1 f_col1 
0 A 0 
1 A 0 
2 B 1 
3 C 2 
4 D 3 
5 E 4 

但是,當我們對DF2

df2["f_col1"]= pd.factorize(df2.col1)[0] 
df2 

做到這一點,我們得到

col1 f_col1 
0 A 0 
1 B 1 
2 D 2 
3 E 3 

這不是我想要的。我想保持相同的數據分解,即在df2我們應該有類似

col1 f_col1 
0 A 0 
1 B 1 
2 D 3 
3 E 4 

謝謝。

PS:這兩個數據集並不總是在同一時間可用,所以我不能連接它們。值應該以df1存儲,並在df2可用時使用。

回答

1

可以重用的df1f_col1列,並通過在df.col1

In [265]: df2.col1.map(df1.set_index('col1').f_col1) 
Out[265]: 
0 0 
1 1 
2 3 
3 4 

設置索引詳細

mapdf2.col1
In [266]: df2['f_col1'] = df2.col1.map(df1.set_index('col1').f_col1) 

In [267]: df2 
Out[267]: 
    col1 f_col1 
0 A  0 
1 B  1 
2 D  3 
3 E  4 

櫃面,df1有多個記錄,使用刪除記錄drop_duplicates

In [290]: df1 
Out[290]: 
    col1 f_col1 
0 A  0 
1 A  0 
2 B  1 
3 C  2 
4 D  3 
5 E  4 

In [291]: df2.col1.map(df1.drop_duplicates().set_index('col1').f_col1) 
Out[291]: 
0 0 
1 1 
2 3 
3 4 
Name: col1, dtype: int32 
+0

感謝。我嘗試了您的解決方案,但由於數據具有重複值,所以出現錯誤。 InvalidIndexError:重建索引僅對唯一賦值的索引對象有效 – Sharek

+0

示例已更新。 – Sharek

+0

使用'drop_duplicates'去除'df1'中的重複項,檢查更新的部分。 – Zero

2

您可以將兩者連接起來DataFrames,然後應用pd.factorize一次整列:

import pandas as pd 
df1 = pd.DataFrame({'col1':["A","B","C","D","E"]}) 
df2 = pd.DataFrame({'col1':["A","B","D","E"]}) 

df = pd.concat({'df1':df1, 'df2':df2}) 
df['f_col1'], uniques = pd.factorize(df['col1']) 
print(df) 

產生

 col1 f_col1 
df1 0 A  0 
    1 B  1 
    2 C  2 
    3 D  3 
    4 E  4 
df2 0 A  0 
    1 B  1 
    2 D  3 
    3 E  4 

df提取df1df2你可以使用df.loc

In [116]: df.loc['df1'] 
Out[116]: 
    col1 f_col1 
0 A  0 
1 B  1 
2 C  2 
3 D  3 
4 E  4 

In [117]: df.loc['df2'] 
Out[117]: 
    col1 f_col1 
0 A  0 
1 B  1 
2 D  3 
3 E  4 

(但是請注意,由於向量化操作的性能會提高,如果您可以將它們應用於較大的DataFrame而不是多次應用到較小的DataFrame,則最好保留df並開槽df1df2 ...)


另外,如果你必須首先生成df1['f_col1'],然後計算 df2['f_col1']後,您可以使用merge加入df1df2col1

import pandas as pd 
df1 = pd.DataFrame({'col1':["A","B","C","D","E"]}) 
df2 = pd.DataFrame({'col1':["A","B","D","E"]}) 

df1['f_col1'], uniques = pd.factorize(df1['col1']) 
df2 = pd.merge(df2, df1, how='left') 
print(df2) 

產量

col1 f_col1 
0 A  0 
1 B  1 
2 D  3 
3 E  4 
+0

謝謝。 這兩個數據集不總是可用的,所以我不能連接它們。值應該以df1存儲,並在df2可用時使用。 – Sharek

+0

我已經添加了一個替代解決方案,它允許在*'df1 ['f_col1']'之後計算'df2 ['f_col1']'*'。 – unutbu

0

您希望跨兩組數據獲得唯一值。然後創建一個系列或字典。這是可以跨兩個數據集使用的分解。使用map獲取您正在查找的輸出。

u = np.unique(np.append(df1.col1.values, df2.col1.values)) 
f = pd.Series(range(len(u)), u) # this is factorization 

分配與map

df1['f_col1'] = df1.col1.map(f) 
df2['f_col1'] = df2.col1.map(f) 

print(df1) 

    col1 f_col1 
0 A  0 
1 A  0 
2 B  1 
3 C  2 
4 D  3 
5 E  4 

print(df2) 

    col1 f_col1 
0 A  0 
1 B  1 
2 D  3 
3 E  4 
相關問題