簡體   English   中英

如何將唯一編號映射到列表列中的每個唯一字符串

[英]How to map a unique number to each unique string in a column of lists

在pandas數據框中,我有一個列,其中每行包含一個字符串列表。 對於每個唯一的字符串,我想分配一個唯一的數字。

如果可能,我想為多列中的每個唯一字符串分配一個唯一的編號。

這是一個最小的例子:

設置初始pandas數據幀

df = pd.DataFrame(data={'A': ['2f4', '1k1', 'nmk'], 'B': ['x', 'y', 'z']})
df.at[0, 'B'] = ['jki', 'gg4', 'k6k']
df.at[1, 'B'] = ['2f4', 'gg4', 'g24']
df.at[2, 'B'] = ['1k1', 'g24', '1k1']

會是這樣的

df

     A                B
0  2f4  [jki, gg4, k6k]
1  1k1  [2f4, gg4, g24]
2  nmk  [1k1, g24, 1k1]

我正在尋找類似的結果

     A                B  MappedA    MappedB
0  2f4  [jki, gg4, k6k]        0  [3, 4, 5]
1  1k1  [2f4, gg4, g24]        1  [0, 4, 6]
2  nmk  [1k1, g24, 1k1]        2  [1, 6, 1]

每個字符串都有一個唯一的編號,從0開始。如果再次出現一個字符串,則再次使用第一個分配的編號。

我找到了解決方案,其中列只有一個字符串或數字,如此

為列pandas數據框分配唯一ID

但我找不到任何列包含值列表的解決方案。

編輯:

澄清一下,b列中列表的長度是可變的。

pandas.factorizenumpy.split

i, u = pd.factorize([*df.A, *np.concatenate(df.B)])
l = df.B.str.len()[:-1].cumsum()
n = len(df)

df.assign(MappedA=i[:n], MappedB=np.split(i[n:], l))

     A                B  MappedA    MappedB
0  2f4  [jki, gg4, k6k]        0  [3, 4, 5]
1  1k1  [2f4, gg4, g24]        1  [0, 4, 6]
2  nmk  [1k1, g24, 1k1]        2  [1, 6, 1]

說明

  1. 將所有列'A''B'分解在一起
  2. 找到'B'中列表的長度,因為它們將幫助定義分割結果數組的位置
  3. 取第一個屬於'MappedA' n
  4. 取其余部分並根據計算的長度進行分割。

可變長度

假設我們有這個df

df = pd.DataFrame(data={'A': ['2f4', '1k1', 'nmk'], 'B': ['x', 'y', 'z']})
df.at[0, 'B'] = ['jki', 'gg4', 'k6k']
df.at[1, 'B'] = ['2f4', 'gg4', 'g24']
df.at[2, 'B'] = ['1k1', 'g24', '1k1', 'pir']

df

     A                     B
0  2f4       [jki, gg4, k6k]
1  1k1       [2f4, gg4, g24]
2  nmk  [1k1, g24, 1k1, pir]

然后相同的解決方案導致

i, u = pd.factorize([*df.A, *np.concatenate(df.B)])
l = df.B.str.len()[:-1].cumsum()
n = len(df)

df.assign(MappedA=i[:n], MappedB=np.split(i[n:], l))

     A                     B  MappedA       MappedB
0  2f4       [jki, gg4, k6k]        0     [3, 4, 5]
1  1k1       [2f4, gg4, g24]        1     [0, 4, 6]
2  nmk  [1k1, g24, 1k1, pir]        2  [1, 6, 1, 7]

暫無
暫無

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

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