![](/img/trans.png)
[英]Assign same unique ID for all chaining element rows from pandas data frame
[英]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
現在使用applymap
和names.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.