我有一个由字符串组成的大熊猫数据框:
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]
这非常慢,但似乎效果很好。对于大型数据集(甚至不到一千个字),这需要很长时间。
你可以尝试这样的单行,使用
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