我有一个超过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循环在算法上可能是困难的.
是否有一种大熊猫友好的方式来正确地重新格式化这些列? (或许我使用的排序不正确?)
解决方法:
您可以使用extract
和zfill
,对于排序列更好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] 举报,一经查实,本站将立刻删除。