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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

3回答

952閲覧

Python3で変数を積み上げる方法をご教示いただけないでしょうか

ano2018

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2018/01/31 01:12

前提・実現したいこと

変数の積上げはPythonで可能でしょうか。
分析で使うデータの形が悪く、加工して使おうとしています。どのようなコードをかけば実現できるかわかりません。

▽今のデータ(CSVのイメージで記載)
ID,M201701,M201702,M201703

1,33,44,55

2,66,77,88

▽加工後に実現したい形

※変数名をvarとnumにしていますが何でもよいです
※varという名前でID以外の変数名を積上げ、値の数値も積上げる、変数を積み上げたのでIDは3行になる

ID,var,num

1,M201701,33

1,M201702,44

1,M201703,55

2,M201701,66

2,M201702,77

2,M201703,88

M201701,M201702,M201703の3つの変数を例で記載していますが、実際には120あり、今後も増えていきます。
そのため、

ID,M201701

ID,M201702

ID,M201703

の3つのテーブルをひとつずつ作って縦に連結するという方法はあまり現実的ではないと思いました。

また行も4000くらいあります。Pythonで自動的にデータ加工できたら楽なので、もし可能ならご教示いただきたく。
よろしくお願いいたします。

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

Python3を使っています。

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

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

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

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

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

otn

2018/01/31 01:19 編集

「積み上げ」とは?質問を「積み上げ」という言葉を使わず、書き直してください。「列の追加」のことですか?
ano2018

2018/01/31 02:25

早速のご回答ありがとうございます。 s_data に固定値を指定する場合、実際には120ほどの変数と4000行のデータなので厳しいです。 s_dataの値をデータから自動的に取得する方法はありますでしょうか。
Lhankor_Mhy

2018/01/31 03:21

「自動的に取得」とはどのような動作のことですか? どのような入力に対してどのような出力をイメージしているのか、具体的に提示してください。また、当初の質問とは内容が変わっているようなので、質問にも明示してください。
ano2018

2018/01/31 11:03

otnさん、Lhankor_Mhyさん、ありがとうございました。入力と出力は質問に記載した通りです。SAS社のJMPというソフトウェアをご存じでしょうか。そのJMPでできる「列の積上げ」と同じ処理になりますが、それが質問に記載した内容になります。「自動的に取得」は、「120くらいの変数数と4000行くらいのデータの大きさに対応した形で処理したい」という質問の内容を実現するための内容となります。しかしながら、YouheiSakuraiさんからのご回答で解決することができました。ありがとうございました。私の質問に対してお時間を使っていただき感謝いたします。本当にありがとうございました。
guest

回答3

0

ベストアンサー

タグにあるので Pandas を使用した方法を回答します。
melt メソッドを使って変換できます。

Python

1import io 2import pandas as pd 3 4# 元のデータ 5raw_df = pd.read_csv(io.StringIO("""ID,M201701,M201702,M201703 61,33,44,55 72,66,77,88 8""")) 9 10# 整然化 11tidy_df = raw_df.melt( 12 id_vars='ID', value_vars=raw_df.columns[1:], var_name='var', value_name='num' 13).sort_values( 14 ['ID', 'var'] 15).reset_index( 16 drop=True 17) 18 19print(tidy_df) 20# ID var num 21# 0 1 M201701 33 22# 1 1 M201702 44 23# 2 1 M201703 55 24# 3 2 M201701 66 25# 4 2 M201702 77 26# 5 2 M201703 88 27 28# list へ変換 29tidy_data = tidy_df.values.tolist() 30print(tidy_data) 31# [[1, 'M201701', 33], [1, 'M201702', 44], [1, 'M201703', 55], [2, 'M201701', 66], [2, 'M201702', 77], [2, 'M201703', 88]] 32 33# CSV形式のテキストに変換 34# ※StringIO の代わりにパスを渡せばファイルへ書き込む: tidy_df.to_csv(r'./output.csv', index=False) 35output_csv = io.StringIO() 36tidy_df.to_csv(output_csv, index=False) 37print(output_csv.getvalue()) 38# ID,var,num 39# 1,M201701,33 40# 1,M201702,44 41# 1,M201703,55 42# 2,M201701,66 43# 2,M201702,77 44# 2,M201703,88

投稿2018/01/31 11:10

copepoda

総合スコア324

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

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

ano2018

2018/02/01 06:06 編集

copepodaさん、ありがとうございます!まさにこれがしたかったことでした。 YouheiSakuraiさんのyieldのものは、進めていくうちにデータがTupleになっており処理が滞って別の質問を立てたところでした。 ありがとうございました!
guest

0

python

1from csv import DictReader 2 3 4def TransReader(fp, **kwargs): 5 yield "ID", "var", "num" 6 for row in DictReader(fp, **kwargs): 7 ID = row.pop("ID") 8 yield from ((ID, key, row[key]) for key in row) 9 10 11with open("sample.csv") as fp: 12 for row in TransReader(fp): 13 print(*row, sep=",")

yieldを上手く使えば何万行あっても大丈夫です。変数も数千くらいなら全然問題にはならないと思います。

※追記:大きなデータでも行けるようにfor文をひとつyield fromで置き換えました。

投稿2018/01/31 05:15

編集2018/01/31 05:22
YouheiSakurai

総合スコア6142

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

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

ano2018

2018/01/31 11:07

YouheiSakuraiさん、ご回答いただきありがとうございました。解決できました。 「yield」と「yield from]、および他にも理解が不足していることがあり、頂いたPGMを理解できていませんが、調べながら知識にしていきたいと思います。 私の質問にお時間を使っていただき感謝します。ありがとうございました。
guest

0

こちらでどうでしょう。

s_data = [["ID", "M201701", "M201702", "M201703"], [1, 33, 44, 55],[2, 66, 77, 88]] d_data = [["ID", "var", "num"]] for i in range(len(s_data)-1): for j in range(len(s_data[0])-1): t_data = [] t_data += [s_data[i+1][0]] t_data += [s_data[0][i+1]] t_data += [s_data[i+1][j+1]] d_data += [t_data] print(d_data)

投稿2018/01/31 01:59

yag1kaz

総合スコア253

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

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

ano2018

2018/01/31 02:26

早速のご回答ありがとうございます。 s_data に固定値を指定する場合、実際には120ほどの変数と4000行のデータなので厳しいです。 s_dataの値をデータから自動的に取得する方法はありますでしょうか。
yag1kaz

2018/01/31 03:19 編集

それは別の質問を建てていただいたほうが質問とタイトルとの一貫性からは、良いようにおもえます。 csvをlistに変換する方法ということになりますね。 回答とセットで私のほうであげておきますね。あげたらURLを転記します。
ano2018

2018/01/31 11:10

yag1kazさん、ご回答いただきありがとうございました。 「csvをlistに変換する方法」かもわかっていないですが、実現したかったことはYouheiSakuraiさんのPGMで解決いたしました。 私の質問にお時間をいただき本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問