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

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

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

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

pandas

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

Q&A

解決済

2回答

1149閲覧

Python】pandasからピポッドテーブルで作ったデータから別のデータフレームに移したい

donadona999s

総合スコア16

Python

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

pandas

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

0グッド

0クリップ

投稿2021/06/08 11:16

編集2021/06/08 12:49

お世話になります。
PythonのPandasのpivot tableで集計したデータを別のデータフレームに移そうと思っています。
下記のプログラムでopen_order_pivotのデータフレームからdf_outputにデータを移すことには成功しているのですが、
open_order_pivotはvalueをつかって「発注残」という項目を集計しています。
その結果、「発注残」という項目がColumnとして認識しておらず、df_outputというデータフレームに移行できませんでした。
open_order_pivotをprintすると、「発注残」という項目が確かにcolumnになっておらず、データを吸い出せませんでした。
イメージ説明
open_order_pivotをエクセルに抽出すると、「発注残」という項目はcolumnとして入っていたので、
一度エクセルに出力して、再度そのエクセルから、df_open_order_pivotというデータフレームにいれてから
データを以降しているのですが、いちいちエクセルに出力することなくデータを移動することはできないでしょうか?
エラー画面はこちらです。
イメージ説明

練習用に作っているダミーデータは下記のようなエクセルです。
イメージ説明
アドバイスいただけますと幸いです。

最終的に完成させたいデータは下記のようなものです。
*dummy1 dummy2の箇所は別のデータベースから持ってくる予定ですが、ここではまだ抽出してないのでNaNとなっています。
イメージ説明

↓失敗したプログラム(一番したにうまくいったプログラムをいれていますが、コメントアウトだけ違います)

python

1import os,sys 2import shutil 3import openpyxl 4import xlrd 5from pprint import pprint 6import pandas as pd 7#============================================================================ 8# ファイルの読み込み 9TEST_DIR = "pivot_table.xlsx" 10book = openpyxl.load_workbook(TEST_DIR) #ファイルの展開 11sheet_name = book.sheetnames #シートの名前取得 12 13#pandas でエクセルを取り込む 14df_open_order = pd.read_excel(TEST_DIR,sheet_name[0]) #ファイルの展開 15 16#取り込んだデータをピボットテーブルする 17open_order_pivot = pd.pivot_table(data=df_open_order, 18 values=['発注残'], 19 index=['注文番号','部材','単価','発注数量'], 20 aggfunc='sum', 21 margins=True,margins_name='合計') 22print(open_order_pivot) 23 24#ピボットテーブルをエクセルに書き出す 25#open_order_pivot.to_excel('temp.xlsx', sheet_name='sheet0') 26#df_open_order_pivot = pd.read_excel('temp.xlsx','sheet0') 27 28df_output_cols = ['注文番号','部材','単価','発注数量','発注残','dummy1','dummy2'] 29df_output = pd.DataFrame(index=[], columns=df_output_cols) 30 31#ピボットからoutputに列をコピー 32df_output.loc[:,'注文番号'] = open_order_pivot.loc[:,'注文番号'] 33df_output.loc[:,'部材'] = open_order_pivot.loc[:,'部材'] 34df_output.loc[:,'単価'] = open_order_pivot.loc[:,'単価'] 35df_output.loc[:,'発注数量'] = open_order_pivot.loc[:,'発注数量'] 36df_output.loc[:,'発注残'] = open_order_pivot.loc[:,'発注残'] 37 38#df_output.loc[:,'注文番号'] = df_open_order_pivot.loc[:,'注文番号'] 39#df_output.loc[:,'部材'] = df_open_order_pivot.loc[:,'部材'] 40#df_output.loc[:,'単価'] = df_open_order_pivot.loc[:,'単価'] 41#df_output.loc[:,'発注数量'] = df_open_order_pivot.loc[:,'発注数量'] 42#df_output.loc[:,'発注残'] = df_open_order_pivot.loc[:,'発注残'] 43 44 45print(df_output) 46

↓うまくいったプログラム

python

1import os,sys 2import shutil 3import openpyxl 4import xlrd 5from pprint import pprint 6import pandas as pd 7#============================================================================ 8# ファイルの読み込み 9TEST_DIR = "pivot_table.xlsx" 10book = openpyxl.load_workbook(TEST_DIR) #ファイルの展開 11sheet_name = book.sheetnames #シートの名前取得 12 13#pandas でエクセルを取り込む 14df_open_order = pd.read_excel(TEST_DIR,sheet_name[0]) #ファイルの展開 15 16#取り込んだデータをピボットテーブルする 17open_order_pivot = pd.pivot_table(data=df_open_order, 18 values=['発注残'], 19 index=['注文番号','部材','単価','発注数量'], 20 aggfunc='sum', 21 margins=True,margins_name='合計') 22print(open_order_pivot) 23 24#ピボットテーブルをエクセルに書き出す 25open_order_pivot.to_excel('temp.xlsx', sheet_name='sheet0') 26df_open_order_pivot = pd.read_excel('temp.xlsx','sheet0') 27 28df_output_cols = ['注文番号','部材','単価','発注数量','発注残','dummy1','dummy2'] 29df_output = pd.DataFrame(index=[], columns=df_output_cols) 30 31#ピボットからoutputに列をコピー 32#df_output.loc[:,'注文番号'] = open_order_pivot.loc[:,'注文番号'] 33#df_output.loc[:,'部材'] = open_order_pivot.loc[:,'部材'] 34#df_output.loc[:,'単価'] = open_order_pivot.loc[:,'単価'] 35#df_output.loc[:,'発注数量'] = open_order_pivot.loc[:,'発注数量'] 36#df_output.loc[:,'発注残'] = open_order_pivot.loc[:,'発注残'] 37 38df_output.loc[:,'注文番号'] = df_open_order_pivot.loc[:,'注文番号'] 39df_output.loc[:,'部材'] = df_open_order_pivot.loc[:,'部材'] 40df_output.loc[:,'単価'] = df_open_order_pivot.loc[:,'単価'] 41df_output.loc[:,'発注数量'] = df_open_order_pivot.loc[:,'発注数量'] 42df_output.loc[:,'発注残'] = df_open_order_pivot.loc[:,'発注残'] 43 44 45print(df_output)

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

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

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

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

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

guest

回答2

0

自己解決

python

1import os,sys 2import shutil 3import openpyxl 4import xlrd 5from pprint import pprint 6import pandas as pd 7#============================================================================ 8# ファイルの読み込み 9TEST_DIR = "pivot_table.xlsx" 10book = openpyxl.load_workbook(TEST_DIR) #ファイルの展開 11sheet_name = book.sheetnames #シートの名前取得 12 13#pandas でエクセルを取り込む 14df_open_order = pd.read_excel(TEST_DIR,sheet_name[0]) #ファイルの展開 15 16#取り込んだデータをピボットテーブルする 17open_order_pivot = pd.pivot_table(data=df_open_order, 18 values=['発注残'], 19 index=['注文番号','部材','単価','発注数量'], 20 aggfunc='sum', 21 margins=True,margins_name='合計') 22print(open_order_pivot) 23open_order_pivot = open_order_pivot.reset_index() #追加した一行 24print(open_order_pivot) 25 26#ピボットテーブルをエクセルに書き出す 27#open_order_pivot.to_excel('temp.xlsx', sheet_name='sheet0') 28#df_open_order_pivot = pd.read_excel('temp.xlsx','sheet0') 29 30df_output_cols = ['注文番号','部材','単価','発注数量','発注残','dummy1','dummy2'] 31df_output = pd.DataFrame(index=[], columns=df_output_cols) 32 33#ピボットからoutputに列をコピー 34df_output.loc[:,'注文番号'] = open_order_pivot.loc[:,'注文番号'] 35df_output.loc[:,'部材'] = open_order_pivot.loc[:,'部材'] 36df_output.loc[:,'単価'] = open_order_pivot.loc[:,'単価'] 37df_output.loc[:,'発注数量'] = open_order_pivot.loc[:,'発注数量'] 38df_output.loc[:,'発注残'] = open_order_pivot.loc[:,'発注残'] 39 40#df_output.loc[:,'注文番号'] = df_open_order_pivot.loc[:,'注文番号'] 41#df_output.loc[:,'部材'] = df_open_order_pivot.loc[:,'部材'] 42#df_output.loc[:,'単価'] = df_open_order_pivot.loc[:,'単価'] 43#df_output.loc[:,'発注数量'] = df_open_order_pivot.loc[:,'発注数量'] 44#df_output.loc[:,'発注残'] = df_open_order_pivot.loc[:,'発注残'] 45 46 47print(df_output)

投稿2021/06/08 22:35

donadona999s

総合スコア16

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

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

0

欲しいもののイメージが良くわかりませんが、こういうものでしょうか。

python

1>>> import pandas as pd 2>>> import io 3>>> 4>>> indata = '''注文番号 部材 単価 発注数量 発注残 5... purchase_01 part_01 1 100 10 6... purchase_02 part_01 0.9 90 30 7... purchase_03 part_02 2 1000 15 8... purchase_04 part_02 2.1 900 2 9... purchase_01 part_01 1.1 100 10 10... purchase_01 part_01 1 100 10''' 11>>> 12>>> with io.StringIO(indata) as f: 13... df_open_order = pd.read_csv(f, sep=' +', engine='python') 14... 15>>> print(df_open_order) 16 注文番号 部材 単価 発注数量 発注残 170 purchase_01 part_01 1.0 100 10 181 purchase_02 part_01 0.9 90 30 192 purchase_03 part_02 2.0 1000 15 203 purchase_04 part_02 2.1 900 2 214 purchase_01 part_01 1.1 100 10 225 purchase_01 part_01 1.0 100 10 23>>> open_order_pivot = pd.pivot_table(data=df_open_order, 24... values=['発注残'], 25... index=['注文番号','部材','単価','発注数量'], 26... aggfunc='sum', 27... margins=True,margins_name='合計') 28>>> df_output = open_order_pivot.reset_index() 29>>> print(df_output) 30 注文番号 部材 単価 発注数量 発注残 310 purchase_01 part_01 1.0 100 20 321 purchase_01 part_01 1.1 100 10 332 purchase_02 part_01 0.9 90 30 343 purchase_03 part_02 2.0 1000 15 354 purchase_04 part_02 2.1 900 2 365 合計 77

投稿2021/06/08 11:47

ppaul

総合スコア24666

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

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

donadona999s

2021/06/08 12:44

アドバイスいただきましてありがとうございます。 少し説明を追加させていただきますと、Aというデータをピポッド処理してBというデータに入れたいのですが、Bというデータにはその他で処理されたCやDのデータを入れる必要があります。 そのためAをピポッド処理したデータをBに入れる練習をしています。 コメントいただきました内容はピポッドテーブルするプログラムかと思いますが、なぜか注文番号~発注数量までが、コラムとして見られていないようです。 そのため、dg_outputというデータフレームを用意して、open_order_pivotからデータを移植しようとしてもエラーが出てしまいます。 「df_output.loc[:,'注文番号'] = open_order_pivot.loc[:,'注文番号']」 そのためopen_order_pivotの結果を一度エクセルに吐き出して、再度読み込むことによって、無理やり変換していますが、エクセルにアクセスすると時間がかかるので、python上で完結しようとしています。
donadona999s

2021/06/08 12:50

お世話になります。ご質問いただきました内容踏まえて、質問欄に記載しましたプログラムを修正しました。 df_output_cols = ['注文番号','部材','単価','発注数量','発注残','dummy1','dummy2'] * dummy1、dummy2を追加(他のデータベースから持ってくること想定。 また完成イメージの画像も追加しました。
ppaul

2021/06/08 15:13

何が入力で、何が出力なのかが良くわかりません。 入力データの例(AとB)とそれから処理された結果が何なのかを、画像ではなく、Pythonに入力できる形で提示していただければ、たいていのものはできます。ただし、donadona999sさんが想定している方法とは全く異なったものになる可能j性があります。 とにかく処理をしたいのであれば、データと最終的に欲しいものを提示してください。 ご自身の考えているやりかたにこだわるのであれば、他の回答者に期待されたほうが宜しいかと思います。
donadona999s

2021/06/08 22:34

お世話になります。お返事ありがとうございます。pandasでピポッドテーブルつくって集計した値のインデックスがずれることが問題で、ずっと悩んでいたのですが、reset_indexを一行挿入したところ、所望の動作ができました。大変お騒がせしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問