質問するログイン新規登録
ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

4110閲覧

pythonでexcelデータのソートの行い方

sake3230

総合スコア1

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/30 14:59

0

0

前提・実現したいこと

pythonでexcelデータのソートを行おうとしています。
(A列の社員番号で昇順ソート)
しかし、ヘッダーが複数、かつ結合されているため、うまくソートできません。

     A列  B列    C列   D列
1行目 社員番号 氏名  2021年1月 2021年2月
2行目          出勤日数  出勤日数
3行目  100  鈴木一郎  20    19
4行目  103  鈴木二郎  20    18
5行目  102  鈴木三郎  20    19

発生している問題・エラーメッセージ

The column label '社員番号' is not unique.

該当のソースコード

df = pd.read_excel('test.xlsx' , sheet_name = 'Sheet1',header=[0,1] ) df_1 = df.sort_values(by='社員番号',ascending=True)

試したこと

・1、2行目で結合したままではソートできないようなので、結合を解除、
1行目に記載、2行目に記載、それぞれを試しましたが、エラー回避できず。
・1行目に記載し、2行目全てを削除(ヘッダーを1行目だけに)するとエラー解消。
・結合したまま、あるいは結合せずとも1、2行目をヘッダーとして残して社員番号で
どうにかソートをしたい。
・プログラムを複雑にしなくてもEXCELの記載方法を改めることで簡単なロジックに
できるなら記載方法を変えてもよい。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

以下の様に行います。

python

1>>> print(df) 2 1行目 社員番号 氏名 44197 44228 3 2行目 Unnamed: 1_level_1 Unnamed: 2_level_1 出勤日数 出勤日数 40 3行目 100 鈴木一郎 20 19 51 4行目 103 鈴木二郎 20 18 62 5行目 102 鈴木三郎 20 19 7>>> df_1 = df.sort_values(by=df.columns[1], ascending=True) 8 9>>> print(df_1) 10 1行目 社員番号 氏名 44197 44228 11 2行目 Unnamed: 1_level_1 Unnamed: 2_level_1 出勤日数 出勤日数 120 3行目 100 鈴木一郎 20 19 132 5行目 102 鈴木三郎 20 19 141 4行目 103 鈴木二郎 20 18

投稿2021/10/30 15:37

ppaul

総合スコア24672

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sake3230

2021/10/31 10:25

回答ありがとうございます。 社員番号をどうにかしようと考えていましたが、df.columns[1]として そのままソートしてしまえばよいのですね。
guest

0

MultiIndex の一部(level=1)を書き換えても良いかと思います。

python

1>>> import pandas as pd 2>>> pd.set_option('display.unicode.east_asian_width', True) 3 4>>> df = pd.read_excel('test.xlsx', sheet_name='Sheet1', header=[0, 1]) 5>>> df 6 社員番号 氏名 20211202127 Unnamed: 0_level_1 Unnamed: 1_level_1 出勤日数 出勤日数 80 100 鈴木一郎 20 19 91 103 鈴木二郎 20 18 102 102 鈴木三郎 20 19 11 12>>> df.columns = df.columns.set_levels( 13 df.columns.levels[1].str 14 .replace(r'Unnamed: (\d).+', '\1', regex=True), 15 level=1) 16>>> df 17 社員番号 氏名 202112021218 0 1 出勤日数 出勤日数 190 100 鈴木一郎 20 19 201 103 鈴木二郎 20 18 212 102 鈴木三郎 20 19 22 23>>> df.sort_values(('社員番号', '0')) 24 社員番号 氏名 202112021225 0 1 出勤日数 出勤日数 260 100 鈴木一郎 20 19 272 102 鈴木三郎 20 19 281 103 鈴木二郎 20 18

※ 空文字列("")にしたかったのですが、インデックスは unique(一意)である必要があるので "0", "1" としています。

投稿2021/10/30 17:01

melian

総合スコア21294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sake3230

2021/10/31 09:08

ありがとうございました。 0,1のインデックスは最後に削除してよいのですよね。
melian

2021/10/31 09:12

インデックスのユニーク制約のために両方を削除(空欄にする)ことができないのです。。。(どちらか片方だけになります)
guest

0

ヘッダを1行にしてからソートすればいいですね。

Python

1import pandas as pd 2 3df = pd.read_excel('test.xlsx' , sheet_name = 'Sheet1',header=[0,1] ) 4print(df) 5""" 6 社員番号 氏名 2021年1月 2021年2月 7 出勤日数 出勤日数 80 100 鈴木一郎 20 19 91 103 鈴木二郎 20 18 102 102 鈴木三郎 20 19 11""" 12df_c = df.columns[:] 13df.columns = [c[0] for c in df_c] 14df_1 = df.sort_values(by='社員番号',ascending=True) 15df_1.columns = df_c 16print(df_1) 17""" 18 社員番号 氏名 2021年1月 2021年2月 19 出勤日数 出勤日数 200 100 鈴木一郎 20 19 212 102 鈴木三郎 20 19 221 103 鈴木二郎 20 18 23"""

投稿2021/10/30 15:35

lehshell

総合スコア1180

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sake3230

2021/10/31 09:57

回答ありがとうございました。 1行にしてソートして元に戻せばよいということですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問