特定の列の値に従ってパンダデータファイルの文字列を並べ替えるにはどうすればよいですか?[複製]
Dec 02 2020
私のPythonプログラムは、パンダ形式のデータファイルを生成します
Source LogP MolWt HBA HBD
0 cne_1 1.1732 263.405 3 1
1 cne_10 2.6639 197.237 2 0
2 cne_100 -0.2886 170.193 4 2
3 cne_1000 1.9644 304.709 5 1
4 cne_1001 1.4986 162.144 3 1
... ... ... ... ... ...
1031 cne_995 3.0179 347.219 4 2
1032 cne_996 4.8419 407.495 6 2
1033 cne_997 3.3560 354.524 3 1
1034 cne_998 7.5465 635.316 4 2
1035 cne_999 3.3514 389.556 4 1
2番目の(ソース)列に基づいて文字列を番号に従って並べ替える必要があるため、並べ替え後の行の正しい順序は次のようになります:cne_1、cne_2、cne_3、cne_4 et使用しようとしました:
df_sorted = df.sort_values('Source', ascending=True)
しかし、それは行の順序の変更を引き起こしませんでした。
回答
5 jezrael Dec 02 2020 at 19:10
最後のパンダバージョンでは、値を整数にkey
分割して値を分割するパラメータを使用でき_
ます。
df_sorted = df.sort_values('Source', key=lambda x: x.str.split('_').str[1].astype(int))
または、並べ替えられた値の位置を取得Series.argsortして、DataFrame.iloc:に渡すこともできます。
df_sorted = df.iloc[df['Source'].str.split('_').str[1].astype(int).argsort()]
print (df_sorted)
Source LogP MolWt HBA HBD
0 cne_1 1.1732 263.405 3 1
1 cne_10 2.6639 197.237 2 0
2 cne_100 -0.2886 170.193 4 2
1031 cne_995 3.0179 347.219 4 2
1032 cne_996 4.8419 407.495 6 2
1033 cne_997 3.3560 354.524 3 1
1034 cne_998 7.5465 635.316 4 2
1035 cne_999 3.3514 389.556 4 1
3 cne_1000 1.9644 304.709 5 1
4 cne_1001 1.4986 162.144 3 1
3 Vishnudev Dec 02 2020 at 19:10
列の整数値を取得し、それを使用して並べ替えます。
df['sortIndex'] = df.Source.str.replace('cne_', '', regex=False).astype(int)
df_sorted = df.sort_values('sortIndex', ascending=True)
2 BillHuang Dec 02 2020 at 19:10
数字を抽出し、intに変換して、それに応じて並べ替えます。(.sort_values(0)
名前のない列には0
自動的に名前が付けられるため)
df_sorted = df.loc[df["Source"].str.extract(r"_(\d+)").astype(int).sort_values(0).index]
結果
print(df_sorted)
Source LogP MolWt HBA HBD
0 cne_1 1.1732 263.405 3 1
1 cne_10 2.6639 197.237 2 0
2 cne_100 -0.2886 170.193 4 2
1031 cne_995 3.0179 347.219 4 2
1032 cne_996 4.8419 407.495 6 2
1033 cne_997 3.3560 354.524 3 1
1034 cne_998 7.5465 635.316 4 2
1035 cne_999 3.3514 389.556 4 1
3 cne_1000 1.9644 304.709 5 1
4 cne_1001 1.4986 162.144 3 1