質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python

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

Q&A

1回答

490閲覧

Python データフレイムを条件に従って並び替える

d__..___

総合スコア18

Python

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

0グッド

0クリップ

投稿2021/06/25 06:51

算数、国語、理科のテストデータには学籍番号と得点が書かれています。
それを指定した設定ファイルの順番で読み取ってデータフレイムとして出力したいです。

具体例を示します。

math.csv
No,Score
1,30
2,40
3,50
4,50

japanese.csv
No,Score
2,30
4,50
5,100

science.csv
No,Score
1,10
60,20

※科目によってはテストを受けていない人もいるので学籍番号とテストの点数がない人もいる

そして設定ファイル(setting.txt)には
math,japanese,science
と言う順番で点数を取得するように指定します。

この場合mathの点数がある場合はmathの点数を、なければjapaneseの点数を、そして次にscienceの点数を読み取りにいきます。

最終的にはscore.csvにその結果を出力したいです。

今回の場合であれば
score.csvには
No,Score
1,30
2,40
3,50
4,50
5,100
60,20

となります。

setting.txtに
japanese,science,math
という条件であれば
score.csvには
No,Score
1,10
2,30
3,50
4,50
5,100
60,20

となります。
setting.txtに書かれていない科目があった場合は一番最後に追加していきます。
このような操作をデータフレイムを使って行いたいです。

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

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

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

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

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

meg_

2021/06/25 06:56

学校の課題でしょうか?未完成で良いので自身で書かれたコードはありませんか?
guest

回答1

0

データの読み込みと書き出しはご自身でできますね。

DataFrameの加工は以下です。
このコードでは、三つのDataFrame名をグローバル変数にしていますが、本当は引数にする方が良いでしょう。

python

1def get_score(setting): 2 setting += [c for c in ['math', 'japanese', 'science'] if c not in setting] 3 df_list = [globals()[f'df_{c}'] for c in setting] 4 df_score = pd.merge(pd.merge(df_list[0], df_list[1][['No']], how='outer'), df_list[2][['No']], how='outer') 5 df_score['Score'] = df_score['Score'].mask(df_score['Score'].isnull(), pd.merge(df_score[['No']], df_list[1], how='left')['Score']) 6 df_score['Score'] = df_score['Score'].mask(df_score['Score'].isnull(), pd.merge(df_score[['No']], df_list[2], how='left')['Score']).astype(int) 7 df_score.sort_values('No', inplace=True) 8 return df_score

実行結果

python

1>>> get_score(['math', 'japanese', 'science']) 2['math', 'japanese', 'science'] 3 No Score 40 1 30 51 2 40 62 3 50 73 4 50 84 5 100 95 60 20 10>>> get_score(["japanese","science"]) 11['japanese', 'science', 'math'] 12 No Score 133 1 10 140 2 30 155 3 50 161 4 50 172 5 100 184 60 20

使用したDataFrame

python

1>>> print(df_math) 2 No Score 30 1 30 41 2 40 52 3 50 63 4 50 7>>> print(df_japanese) 8 No Score 90 2 30 101 4 50 112 5 100 12>>> print(df_science) 13 No Score 140 1 10 151 60 20

投稿2021/06/25 14:52

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問