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_0
和 R20_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
我有一个包含以下内容的 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_0
和 R20_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