Python Pandas:根据第一列的内容对 CSV 文件进行排序

Python Pandas: Sort a CSV file depending upon the contents of its first column

我有一个包含以下内容的 CSV 文件:

R10_0_yrdi_391    111    1.11    1.0    1.1    111.0
R10_0_yfyrn_9132    222    2.22    2.0    2.2    222.0
R10_0_hfeisk_3    333    3.33    3.0    3.3    333.0
R20_0_yrdi_391    444    4.44    4.0    4.4    444.0
R20_0_yfyrn_9132    555    5.55    5.0    5.5    555.0
R20_0_hfeisk_3    666    6.66    6.0    6.6    666.0

现在我想生成一个新的 CSV 文件,其中第一列已排序,使得对应于 R10_0R20_0 值的相同值将并排放置:

R10_0_yrdi_391    111    1.11    1.0    1.1    111.0
R20_0_yrdi_391    444    4.44    4.0    4.4    444.0
R10_0_yfyrn_9132    222    2.22    2.0    2.2    222.0
R20_0_yfyrn_9132    555    5.55    5.0    5.5    555.0
R10_0_hfeisk_3    333    3.33    3.0    3.3    333.0
R20_0_hfeisk_3    666    6.66    6.0    6.6    666.0

另一个问题是第一列 R10_0_R20_0_ 的部分是固定的,但后面部分的长度,即。 _yrdi_391_yfyrn_9132_hfeisk_3 是可变的。 我试过使用:

f = df.columns.values.tolist()
df.sort_values(by=f[:1])

但它把所有 R10_0_R20_0_ 聚在一起。

任何帮助将不胜感激。

我相信您需要 sorted 通过 2 个参数运行并通过 reindex:

更改顺序
#create index by first column by position
df = df.set_index(df.columns[0])
#create index by name of first column
#df = df.set_index('a')
a = sorted(df.index, key=lambda x: (x.split('_')[2:], x.split('_')[:2]), reverse=True)
df = df.reindex(a)
print (df)
                    b     c    d    e      f
a                                           
R20_0_yrdi_391    444  4.44  4.0  4.4  444.0
R10_0_yrdi_391    111  1.11  1.0  1.1  111.0
R20_0_yfyrn_9132  555  5.55  5.0  5.5  555.0
R10_0_yfyrn_9132  222  2.22  2.0  2.2  222.0
R20_0_hfeisk_3    666  6.66  6.0  6.6  666.0
R10_0_hfeisk_3    333  3.33  3.0  3.3  333.0

或者:

a = sorted(df.index, key=lambda x: (x.split('_')[2:], x.split('_')[:2]))
df = df.reindex(a)
print (df)

                    b     c    d    e      f
a                                           
R10_0_hfeisk_3    333  3.33  3.0  3.3  333.0
R20_0_hfeisk_3    666  6.66  6.0  6.6  666.0
R10_0_yfyrn_9132  222  2.22  2.0  2.2  222.0
R20_0_yfyrn_9132  555  5.55  5.0  5.5  555.0
R10_0_yrdi_391    111  1.11  1.0  1.1  111.0
R20_0_yrdi_391    444  4.44  4.0  4.4  444.0