使用python中的shift键将列表转换为数据帧

2024-09-26 17:43:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新来的。拜托,我想从一个不同基序的氨基酸序列中得到Levenshtein距离。 所以,我得到了一个如下示例所示的列表。我想知道如何在数据帧上排列列表,每“N”行向右移动一列。在这个例子中,N=3,我想改变N的任意值。我正在使用python,谢谢

amino acid sequence


Tags: 数据距离示例列表序列例子levenshtein基序
2条回答

如果您需要数据帧,可以在pandas中使用df.shift(periods=n, axis=1)。例如

import pandas as pd 
import numpy as np 

n = 3
List1 = ['1', '5', '2', '3', '1', '3', '1', '3', '0', '0', '5', '1']
List2 = ['A', 'B', 'C', 'D', 'E', 'F'] 

df = pd.DataFrame(data = [List1] * n +  [[np.nan] * len(List1)] * n).transpose()
df.columns = List2

for x in range(0, len(List1), n):
    df.loc[x:(x+n-1)] = df.loc[x:(x+n-1)].shift(periods = x // n, axis = 1)

df

将为您提供:

      A    B    C    D    E    F
0     1    1    1  NaN  NaN  NaN
1     5    5    5  NaN  NaN  NaN
2     2    2    2  NaN  NaN  NaN
3   NaN    3    3    3  NaN  NaN
4   NaN    1    1    1  NaN  NaN
5   NaN    3    3    3  NaN  NaN
6   NaN  NaN    1    1    1  NaN
7   NaN  NaN    3    3    3  NaN
8   NaN  NaN    0    0    0  NaN
9   NaN  NaN  NaN    0    0    0
10  NaN  NaN  NaN    5    5    5
11  NaN  NaN  NaN    1    1    1

一种方法是创建一个dictionary,为每个字母存储给定表的列:

n = 3
list1 = [1, 5, 2, 3, 1, 3, 1, 3, 0, 0, 5, 1]
list2 = ['A', 'B', 'C', 'D', 'E', 'F']

table = dict()

for i, letter in enumerate(list2):
    start = max(0, n * (i - n + 1))
    end = min(len(list1), n * (i + 1))
    table[letter] = [None] * start \
            + list1[start:end] \
            + [None] * (len(list1) - end)

print(table)

哪个输出

{'A': [1, 5, 2, None, None, None, None, None, None, None, None, None], 'B': [1, 5, 2, 3, 1, 3, None, None, None, None, None, None], 'C': [1, 5, 2, 3, 1, 3, 1, 3, 0, None, None, None], 'D': [None, None, None, 3, 1, 3, 1, 3, 0, 0, 5, 1], 'E': [None, None, None, None, None, None, 1, 3, 0, 0, 5, 1], 'F': [None, None, None, None, None, None, None, None, None, 0, 5, 1]}

使用漂亮的打印,可以重新创建给定的表:

print(' ' + ' '.join(list2))
for i in range(len(list1)):
    line = ""
    for letter in list2:
        s = table[letter][i]
        line += f"{s:2d}" if s is not None else "  "
    print(line)

哪张照片

 A B C D E F
 1 1 1
 5 5 5
 2 2 2
   3 3 3
   1 1 1
   3 3 3
     1 1 1
     3 3 3
     0 0 0
       0 0 0
       5 5 5
       1 1 1

相关问题 更多 >

    热门问题