Python Pandas: сортировка файла CSV в зависимости от содержимого его первого столбца - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть 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_ вместе.

Любая помощь будет по достоинству оценена.

1 Ответ

0 голосов
/ 13 ноября 2018

Я полагаю, вам нужно 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
...