根据DataFrame中不同长度输入的顺序查找唯一字符

Finding unique characters based on order from inputs of different lengths in DataFrame

首先,我在 Whosebug 上查看了 Q1 , Q2, ,但其中 none 与我的问题直接相关。我正在使用数据框,顺序对我来说很重要。

我正在创建一个虚拟数据框以更好地解释我的问题。

data = {'seq': ['YSPNNIQHFHEEHLVHFVLAVLSLTTPPLLCVWNR','TLGTGSFGRVMLVHYAMKILDKVLQIEHTLNEKLVKLMVMEYVPGGEMFYDKPENLLIQVTDFGFAGFDY',
                'EKIGEGTYGVVYKVAMKVSLQLIFEFLSMDLKKHKPQNLLILADFL']}

dummy_df = pd.DataFrame(data)

我的目的是按照这个字符串的顺序找到唯一的字符。然后通过创建数据框来保存它们。

我的期望输出:

['Y', 'S', 'P', 'N', 'I', 'Q', 'H', 'F', 'E', 'L', 'V', 'A', 'T', 'C', 'W', 'R']
['T', 'L', 'G', 'S', 'F', 'R', 'V', 'M', 'H', 'Y', 'A', 'K', 'I', 'D', 'Q', 'E', 'N', 'P']
['E', 'K', 'I', 'G', 'T', 'Y', 'V', 'A', 'M', 'S', 'L', 'Q', 'F', 'D', 'H', 'P', 'N']

其实我有两个解决办法:

1)

unique_char = []
for c in dummy_df ['seq'][0]:
    if not c in unique_char:
        unique_char.append(c)
print(unique_char)

它工作正常,但通常我的行数超过 1000。当我设置 for 循环结构时出现错误,每个循环结构将 运行 分开。然后我需要将此解决方案转换为数据框。

2

from collections import defaultdict
dictionary = defaultdict(set)

for i in range(len(dummy_df['seq']):
    for c in dummy_df ['seq'][i]:
        if not c in dictionary[i]:
          dictionary[i].add(c)

它适用于所有行,但结果不按顺序。

例如,解决方案 2 的输出 为了 词典[0](第一行)

{'A',
 'C',
 'E',
 'F',
 'H',
 'I',
 'L',
 'N',
 'P',
 'Q',
 'R',
 'S',
 'T',
 'V',
 'W',
 'Y'}

应该是

['Y', 'S', 'P', 'N', 'I', 'Q', 'H', 'F', 'E', 'L', 'V', 'A', 'T', 'C', 'W', 'R']

其实你可以通过字典按顺序找到唯一的条目。

for i in data['seq']:
    print(list(dict.fromkeys(i)))
    
['Y', 'S', 'P', 'N', 'I', 'Q', 'H', 'F', 'E', 'L', 'V', 'A', 'T', 'C', 'W', 'R']
['T', 'L', 'G', 'S', 'F', 'R', 'V', 'M', 'H', 'Y', 'A', 'K', 'I', 'D', 'Q', 'E', 'N', 'P']
['E', 'K', 'I', 'G', 'T', 'Y', 'V', 'A', 'M', 'S', 'L', 'Q', 'F', 'D', 'H', 'P', 'N']

你可以做一个列表理解来添加到数据框中。

new_data = [list(dict.fromkeys(i)) for i in data['seq']]