pandas 按包含字符-数字-字符值的列对数据框进行排序

djmepvbi  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(148)

我的Dataframe中有一列的值如下所示(我想按此列对我的Dataframe进行排序):

Mutations=['A67D','C447E','C447F','C447G','C447H','C447I','C447K','C447L','C447M','C447N','C447P','C447Q','C447R','C447S','C447T','C447V','C447W','C447Y','C447_','C92A','C92D','C92E','C92F','C92G','C92H','C92I','C92K','C92L','C92M','C92N','C92P','C92Q','C92R','C92S','C92T','C92V','C92W','C92_','D103A','D103C','D103F','D103G','D103H','D103I','D103K','D103L','D103M','D103N','D103R','D103S','D103T','D103V','silent_C88G','silent_G556R']

基本上所有的值都是Char_1-Digit-Char_2的格式,我想将它们排序为Digit为最高优先级,Char_2为次高优先级。
我想我可以用sorted()来实现这个功能,把这个列表排序函数作为我的sorted( , key=)

def alpha_numeric_sort_key(unsorted_list):
  
   return int( "".join( re.findall("\d*", unsorted_list)  )   )

这对列表有效。我对我的dataframe做了同样的尝试,但是得到了这个错误:

df = raw_df.sort_values(by='Mutation',key=alpha_numeric_sort_key,ignore_index=True) #sorts values by one letter amino acid code

TypeError: expected string or bytes-like object

我只需要了解什么是正确的方式来了解如何使用df.sort_values()中的key=的方式,可以理解的人有一个中级水平的经验使用Python。
我还提供了我的数据框架的头,如果这有助于回答我的问题,如果没有,忽略它。
谢谢!

raw_df=pd.DataFrame({'0': {0: 100, 1: 100, 2: 100, 3: 100}, 'Mutation': {0: 'F100D', 1: 'F100S', 2: 'F100M', 3: 'F100G'},
                 'rep1_AGGTTGGG-TCGATTAG': {0: 2.0, 1: 15.0, 2: 49.0, 3: 19.0},
                 'Input_AGGTTGGG-TCGATTAG': {0: 48.0, 1: 125.0, 2: 52.0, 3: 98.0}, 'rep2_GTGTGGTG-TGTTCTAG': {0: 8.0, 1: 40.0, 2: 33.0, 3: 11.0}, 'WT_plasmid_GTGTGGTG-TGTTCTAG': {0: 1.0, 1: 4.0, 2: 1.0, 3: 1.0},
                 'Amplicon': {0: 'Amp1', 1: 'Amp1', 2: 'Amp1', 3: 'Amp1'},
                 'WT_plas_norm': {0: 1.9076506328630974e-06, 1: 7.63060253145239e-06, 2: 1.9076506328630974e-06, 3: 1.9076506328630974e-06},
                 'Input_norm': {0: 9.171121666392808e-05, 1: 0.0002388312933956, 2: 9.935381805258876e-05, 3: 0.0001872437340221},
                 'escape_rep1_norm': {0: 4.499235130027895e-05, 1: 0.000337442634752, 2: 0.0011023126068568, 3: 0.0004274273373526},
                 'escape_rep1_fitness': {0: -1.5465897459555915, 1: -1.087197258196361, 2: -0.1921857678502714, 3: -0.8788509789836517} } )
xqnpmsa8

xqnpmsa81#

如果您查看sort_values中参数key的定义,它清楚地表示:
它应该期望一个Series并返回一个与输入具有相同形状的Series。它将由独立地应用于中的每一列。
不能使用单个标量作为键进行排序。
您可以通过两种方式进行排序:
1.第一种方法:

sort_int_key = lambda col: col.str.extract("(\d+)", expand=False)
sort_char_key = lambda col: col.str.extract("(?<=)\d+(\w+)", expand=False)
raw_df.sort_values(by="Mutation", key=sort_int_key).sort_values(
    by="Mutation", key=sort_char_key
)

1.将提取的值指定为临时列,并使用指定这些列的by参数对其进行排序:

raw_df.assign(
    sort_int=raw_df["Mutation"].str.extract("(\d+)", expand=False),
    sort_char=raw_df["Mutation"].str.extract("(?<=)\d+(\w+)", expand=False),
).sort_values(by=["sort_int", "sort_char"])

相关问题