簡體   English   中英

為列pandas數據框分配唯一ID

[英]Assign unique id to columns pandas data frame

您好我有以下數據幀

df = 
A      B   
John   Tom
Homer  Bart
Tom    Maggie
Lisa   John 

我想為每個名稱分配一個唯一的ID並返回

df = 
A      B         C    D

John   Tom       0    1
Homer  Bart      2    3
Tom    Maggie    1    4 
Lisa   John      5    0

我所做的是以下內容:

LL1 = pd.concat([df.a,df.b],ignore_index=True)
LL1 = pd.DataFrame(LL1)
LL1.columns=['a']
nameun = pd.unique(LL1.a.ravel())
LLout['c'] = 0
LLout['d'] = 0
NN = list(nameun)
for i in range(1,len(LLout)):
   LLout.c[i] = NN.index(LLout.a[i])
   LLout.d[i] = NN.index(LLout.b[i])

但由於我有一個非常大的數據集,這個過程非常緩慢。

這是一種方式。 首先獲取唯一名稱數組:

In [11]: df.values.ravel()
Out[11]: array(['John', 'Tom', 'Homer', 'Bart', 'Tom', 'Maggie', 'Lisa', 'John'], dtype=object)

In [12]: pd.unique(df.values.ravel())
Out[12]: array(['John', 'Tom', 'Homer', 'Bart', 'Maggie', 'Lisa'], dtype=object)

並將其設為系列,將名稱映射到各自的數字:

In [13]: names = pd.unique(df.values.ravel())

In [14]: names = pd.Series(np.arange(len(names)), names)

In [15]: names
Out[15]:
John      0
Tom       1
Homer     2
Bart      3
Maggie    4
Lisa      5
dtype: int64

現在使用applymapnames.get來查找這些數字:

In [16]: df.applymap(names.get)
Out[16]:
   A  B
0  0  1
1  2  3
2  1  4
3  5  0

並將其分配給正確的列:

In [17]: df[["C", "D"]] = df.applymap(names.get)

In [18]: df
Out[18]:
       A       B  C  D
0   John     Tom  0  1
1  Homer    Bart  2  3
2    Tom  Maggie  1  4
3   Lisa    John  5  0

注意:這假設所有值都是以名稱開頭的名稱,您可能只想將其限制為某些列:

df[['A', 'B']].values.ravel()
...
df[['A', 'B']].applymap(names.get)

(注意:我假設你不關心映射的精確細節 - 例如John變成的數字 - 但只有那個有。)

方法#1:您可以使用Categorical對象作為中介:

>>> ranked = pd.Categorical(df.stack()).codes.reshape(df.shape)
>>> df.join(pd.DataFrame(ranked, columns=["C", "D"]))
       A       B  C  D
0   John     Tom  2  5
1  Homer    Bart  1  0
2    Tom  Maggie  5  4
3   Lisa    John  3  2

感覺你應該能夠將分類視為以某種方式提供編碼字典(無論是直接還是通過生成系列),但我看不到一種方便的方法。

方法#2:你可以使用rank("dense") ,它按順序為每個值生成一個遞增的數字:

>>> ranked = df.stack().rank("dense").reshape(df.shape).astype(int)-1
>>> df.join(pd.DataFrame(ranked, columns=["C", "D"]))
       A       B  C  D
0   John     Tom  2  5
1  Homer    Bart  1  0
2    Tom  Maggie  5  4
3   Lisa    John  3  2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM