微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何排序格式错误的pandas Dataframe列?

我有一个超过10000列的pandas Dataframe.这些列需要按顺序排序.通常这很简单:

import numpy as np
import pandas as pd
df = pd.read_csv("...*.csv")
df.reindex_axis(sorted(df.columns), axis=1)  # sort the columns of the dataframe

对于我的Dataframe df,这些列中的每一列都是以下格式的字符串:

sampleFirsTNUMBER_SECONDNUMBER

例如sample42_5864183439,sample3_8976711222

编辑:作为示例数据帧,

df = pd.DataFrame([[1,2,3,4, 5], [5, 6, 7, 8, 9], [9, 10, 11, 12, 13]],columns=['sample1_5','sample10_5','sample100_5','sample1_50', 'sample111_500'])
print(df)

   sample1_5  sample10_5  sample100_5  sample1_50  sample111_500
0          1           2            3           4              5
1          5           6            7           8              9
2          9          10           11          12             13

我遇到的问题是排序值的经典问题:目前,sample10 _ ####出现在sample1 _ ####之前.

对于“SECONDNUMBER”也是如此,即10000在1之前,在10之前等等.
也就是说,chr10_10001当前排序为chr10_11之前.

我如何正确格式化这些列,以便“FirsTNUMER”和“SECONDNUMBER”都按顺序排序?我相信,而不是sample1_5,此列必须是sample01_000005格式.手动为这个大小的数据集重新注释这些列名称是不可行的;解析每个数字的for循环在算法上可能是困难的.

是否有一种大熊猫友好的方式来正确地重新格式化这些列? (或许我使用的排序不正确?)

解决方法:

您可以使用extractzfill,对于排序列更好sort_index,轴= 1:

df = pd.DataFrame([[1,2,3,4]],columns=['sample1_5','sample10_5','sample100_5','sample1_50'])
df = df.sort_index(axis=1)
print (df)
   sample100_5  sample10_5  sample1_5  sample1_50
0            3           2          1           4

df1 = df.columns.to_series().str.extract('([a-z]+)(\d+)_(\d+)', expand=True)
df1[1] = df1[1].str.zfill(3) 
df1[2] = df1[2].str.zfill(2)
df1['new'] = df1.apply(lambda x: '{}{}_{}'.format(x[0],x[1],x[2]), axis=1)
print (df1)
                  0    1   2           new
sample100_5  sample  100  05  sample100_05
sample10_5   sample  010  05  sample010_05
sample1_5    sample  001  05  sample001_05
sample1_50   sample  001  50  sample001_50

df.columns = df1['new']
df.columns.name = None
print (df)
   sample100_05  sample010_05  sample001_05  sample001_50
0             3             2             1             4

print (df.sort_index(axis=1))
   sample001_05  sample001_50  sample010_05  sample100_05
0             1             4             2             3

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐