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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

列挙型

データ型の一種で、要素・メンバなど名前のある値や、型の列挙子によって構成されます。

Python

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

Q&A

解決済

2回答

716閲覧

データを辞書型に変換して1つのキーに対して複数のリストを持たせたい。

taka0606

総合スコア9

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

列挙型

データ型の一種で、要素・メンバなど名前のある値や、型の列挙子によって構成されます。

Python

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

0グッド

0クリップ

投稿2020/07/03 10:28

csvで保存された学生のテスト結果のデータがあるとします(下の例を参照)。
Classをキーにして辞書型に変換して処理したいと考えています。
(キーごとに条件を指定してデータを抽出するのを目的としています。)
その際、1つのキーに対して値が入った複数のリストを持たせたいと考えていますが上手くいきません。
素人質問で恐縮ですが、分かる方いらっしゃったらご教授お願いいたします。

【テスト結果のデータ】

ClassNameEnglishMathScienceSociety
A田中63756882
A山田74728386
B高橋59657181
B佐藤70717481
C吉田66726173
C斎藤72675869
C小池60786166
D高田88919280
D橋本60796877
D工藤79838590

試したこと

以下のコードのように試しましたが、少し複雑な形に変換されます。
必要ない列名がキーになって取得されるのを防ぎたいです。

python

1import pandas as pd 2df1 = pd.read_csv('input.csv') 3df1 4"""出力 5|Class|Name|English|Math|Science|Society| 6| A |田中| 63 | 75 | 68 | 82 | 7| A |山田| 74 | 72 | 83 | 86 | 8| B |高橋| 59 | 65 | 71 | 81 | 9| B |佐藤| 70 | 71 | 74 | 81 | 10| C |吉田| 66 | 72 | 61 | 73 | 11| C |斎藤| 72 | 67 | 58 | 69 | 12| C |小池| 60 | 78 | 61 | 66 | 13| D |高田| 88 | 91 | 92 | 80 | 14| D |橋本| 60 | 79 | 68 | 77 | 15| D |工藤| 79 | 83 | 85 | 90 | 16""" 17result = {} 18for c in df1["Class"].unique(): 19 df_part = df1[df1["Class"]==c] 20 result[c] = {} 21 for col in df_part.columns: 22 if col == "Class": 23 continue 24 result[c][col] = [*df_part[col].values] 25result

試した結果

python

1{'A': {'Name': ['山田', '田中'], 2 'English': [1, 2], 3 'Math': [11, 12], 4 'Science': [21, 22], 5 'Society': [31, 32]}, 6 'B': {'Name': ['佐藤', '吉田'], 7 'English': [3, 4], 8 'Math': [13, 14], 9 'Science': [23, 24], 10 'Society': [33, 34]}, 11 'C': {'Name': ['工藤', '田中', '斉藤'], 12 'English': [5, 6, 7], 13 'Math': [15, 16, 17], 14 'Science': [25, 26, 27], 15 'Society': [35, 36, 37]}, 16 'D': {'Name': ['高橋', '小池', '橋本\u3000'], 17 'English': [8, 9, 10], 18 'Math': [18, 19, 20], 19 'Science': [28, 29, 30], 20 'Society': [38, 39, 40]}}

本来得たい結果

Python

1df = {'A':[ ['田中', 63, 75, 68, 82], ['山田', 74, 72, 83, 86] ], 'B':[ ['高橋', 59, 65, 71, 81], ['佐藤', 70, 71, 74, 81] ], 2 'C':[ ['吉田', 66, 72, 61, 73], ['斉藤', 72, 67, 58, 69], ['小池', '60', '78', '61', '66'] ], 3 'D':[ ['高田', 88, 91, 92, 80], ['橋本', 60, 79, 68, 77], ['工藤', 79, 83, 85, 90] ]}

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

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

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

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

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

guest

回答2

0

ベストアンサー

この元のコードですが、、、
以下の質問に対する回答で私が作成したコードですね。

https://teratail.com/questions/273962

さすがに見過ごせないので苦言を言わせていただきますね。

人が作ったものをそのまま使って質問するのは真摯といえないと思います。
動かない度にここに質問して回答を得ようと思っておられるのでしょうか?

元のコードの動きも全然理解されていらっしゃらない気がいたします。

なぜ結果が'English': [1, 2],となっているのか理解していますか?
なぜここが点数じゃなくなっているのでしょう?

まずはもう少しpandasについて勉強すべきでしょう。
仕様通り作成するが第一ステップです。
高速化なんてその次ですよ。

投稿2020/07/03 14:22

snkmr0221

総合スコア11

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

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

taka0606

2020/07/03 14:59 編集

不快な思いをさせてしまい申し訳ありませんでした。やってほしいことを丸投げした質問ではまずい、でも何をどう改善すべきか分からない。そんな状況でsnkmr0221さんのコードをそのまま使ってしまいました。ご指摘の通り、Pandasの勉強不足なところが大きいので改めて勉強し直してみます。
snkmr0221

2020/07/03 15:12

すみません、厳しくコメントしすぎました。 pandasの勉強は以下などが参考になると思います。  「Python実践データ分析100本ノック」  https://www.amazon.co.jp/dp/4798058750 勉強、がんばってください。
taka0606

2020/07/03 15:37

ありがとうございます。 書籍の方参考にさせていただきます。
guest

0

オリジナルのソースコードをなるべく使いたかったのですが、大変そうだったので新たに下記のようにしました。

python

1result = {} 2for c, df_part in df1.groupby("Class"): 3 result[c] = df_part.iloc[:, 1:].values.tolist() 4print(result)

投稿2020/07/03 11:58

yymmt

総合スコア1615

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

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

taka0606

2020/07/03 13:06

回答ありがとうございます。 もしよろしければよろしければ、処理を高速化することは可能でしょうか。 オリジナルのソースコードと全然違うものになっても構いません。 よろしくお願いいたします。
yymmt

2020/07/03 13:14

高速化にも色々ありまして、1ヶ月かかる処理を1週間にしたいのか、1分の処理を10秒にしたいのかで取るべき方策が異なります。前者なら分散処理が良いですし、後者ならデータ構造・アルゴリズム・プログラミング言語の再考が必要です。何がしたいのでしょう?
taka0606

2020/07/03 14:03

当方、プログラミング初心者で至らない点も多く愚問だったかもしれません。 今回、レコード数が10万程度のCSVのデータに今回の処理を適用しようと考えていました。 データフレームにて処理していたときは軽々処理できていたのに、辞書型に変換しようとしたら 全然処理が終わらなかったので、無駄なステップが多かったのかなと思いました。 (最初に試した自分のコードをもとにされているので、それが原因かと推察しました。) 教えていただいた話を踏まえると、アルゴリズムの再考またはpython以外で処理するしかないのですかね。
yymmt

2020/07/03 14:16 編集

データフレームで高速に取り出すことができるのに、わざわざ辞書を作る理由があるのだろうか、という疑問はあります。result["A"]とアクセスするのとdf[df["Class"]=="A"]では長い時間をかけて変換する意味はあまりないように思います。また10万程度のCSVを一度変換して、次回以降は変換しないようpickle形式で保存しておいて、次回は保存したファイルを読み込むだけなど工夫はあると思います。
taka0606

2020/07/03 15:01

そもそも辞書で処理する必要があるのか再考する必要があるようですね。 もう少し自分なりに考えてみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問