将字符分配给每列中的唯一字符串并将值重置为该字符

问题描述 投票:0回答:1

我有一个由字符串组成的大熊猫数据框:

  col1   col2         col3
0 'If', 'albatross', 'boss'
1 'If', 'boot',      'god'
2 'If', 'chicken',   'alive'
3 'If', 'chicken',   'dead'

我想按字母顺序对每个位置中的唯一单词进行排序,并为每个单词分配一个符号(A,B,C,...)(例如老板-B神-D活着-A死了-C),这样,如果三个文本中出现不同的字符串,则符号 A、B 和 C 会在数据框中占据它们的位置。在这种情况下我们得到:

     col1  col2 col3
   0  'A', 'A', 'B'
   1  'A', 'B', 'D'
   2  'A', 'C', 'A'
   3  'A', 'C', 'C'

对于非常大的数据集,有没有一种有效的方法来做到这一点? (我正在尝试将长脚本(例如 BIBLE 长)转换为可以输入系统发育程序的伪遗传数据)

到目前为止,我已经成功创建了按字母顺序排列的唯一字符串(列表 e)和字母(列表 sym)的列表: 导入字符串

sym=list(string.ascii_uppercase)
e=[]
for i in data.columns:
    c=sorted(data[i].unique(),key=str.lower)
    e.append(c)

我正在努力将数据框中的字符串切换为相应的字母。我试过了:

for i in data.columns:
    for j in e:
        for k in range(len(j)):
            data.loc[data[i] == j[k], i] = sym[k]

这非常慢,但似乎效果很好。对于大型数据集(甚至不到一千个字),这需要很长时间。

arrays pandas string sorting
1个回答
0
投票

你可以尝试这样的单行,使用

pd.factorize
:

df.apply(lambda s: pd.factorize(s)[0]).applymap(lambda c: ascii_uppercase[c])

输出:

  col1 col2 col3
0    A    A    A
1    A    B    B
2    A    C    C
3    A    C    D
© www.soinside.com 2019 - 2024. All rights reserved.