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

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

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

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

pandas

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

Q&A

解決済

2回答

784閲覧

[Python]indexが完全には一致しないデータフレーム達を連結したい

Kozyma

総合スコア5

Python

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

pandas

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

0グッド

0クリップ

投稿2021/12/28 06:09

前提・実現したいこと

商品の月ごと時間帯ごとの売上リストがあります。
商品名をIndexとし、朝の年次売上合計、昼の年次売上合計、夕の年次売上合計を1つのExcelシートにまとめたいです。

<作りたい形>

python

1商品名 朝売上 昼売上 夕売上 2りんご 100 300 100 3みかん 100 400 40 4ぶどう 500 100 200 5バナナ 100 900 100 6 7#商品名は5000種ほどあります。

現在、pandasからpivot_tableを用いて、時間帯ごとの集計を行い、
朝_年次_売上.xlsx
昼_年次_売上.xlsx
夕_年次_売上.xlsx
の3つのファイルが手元に出来ました。

発生している問題

朝・昼・夕の各売上集計ファイルに記載された商品名が完全には一致していないため(売上がないと商品名が記録されない)、出来上がった朝・昼・夕の売上集計ファイルをpandas.concat()でヨコに並べると、集計がずれてしまいます。

python

1import pandas as pd 2df_morning=[] #朝年次売上 3df_noon=[] #昼年次売上 4df_evening=[] #夕年次売上 5 6df_all=pd.concat([df_morning,df_noon,df_evening], axis=1) 7 8print(df_all) 9 10#以下、出力結果サンプルです(朝昼夕で商品名がずれてしまう) 11商品名 朝売上 商品名 昼売上 商品名 夕売上 12りんご 100 りんご 300 りんご 100 13みかん 100 みかん 400 みかん 40 14ぶどう 500 バナナ 100 ぶどう200 15バナナ 100 すいか 900 すいか 100

試そうとしていること

pivot_tableでdf_morning, df_noon, df_eveningの商品名を3つまとめてpivot_tableのインデックスに読み込む方法がないか探しています。その後、3つまとめて作成したインデックスをもつpivot_tableに売上を集計すれば、朝・昼・夕で同じ商品名をもつ売上リストが出来るのでは?と思っています。しかしpivot_tableに複数のデータフレームから読み込む方法がまだ見つかりません。
それ以外の良い方法があればアドバイスをいただければ大変助かります。

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

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

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

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

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

guest

回答2

0

ベストアンサー

pandas.DataFrameを結合するmerge, join(列・インデックス基準)外部結合(outer_join): how='outer'を使って結合すれば、そろえることができます。

存在しないところにはNaNが入りますので、pandasで欠損値NaNを除外(削除)・置換(穴埋め)・抽出に書かれている欠損値を置換(穴埋め)する: fillna()を使って0に変更するのがよいでしょう。

投稿2021/12/28 06:34

編集2021/12/28 06:35
ppaul

総合スコア24670

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

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

Kozyma

2021/12/28 07:26

ppaulさま、いつも早々にアドバイスをくださりありがとうございます! いただいたアドバイスと、調べついたサイトを参考にmergeを使ったら、まさに狙ったとおりの結果がでました! ~~~python import pandas df1=[] #朝年次売上 df2=[] #昼年次売上 df3=[] #夕年次売上 #productごとにsalseを集計する salse1=df1.pivot_table(index="product", values="salse",aggfunc='sum', fill_value=0) salse2=df2.pivot_table(index="product", values="salse",aggfunc='sum', fill_value=0) salse3=df3.pivot_table(index="product", values="salse",aggfunc='sum', fill_value=0) #mergeで結合する df_12=salse1.merge(salse2, how="outer", left_on="product", right_on="product") df_123=df_12.merge(salse3, how="outer", left_on="product", right_on="product") df_123=df_123.fillna(0) df_123.to_excel("年次集計_朝昼夕.xlsx") ~~~ <参考サイト> https://obgynai.com/python-pandas-index-merge-join/ 解決しましたので、ベストアンサーに選ばせていただきました。 can110さまに教えていただいた.joinで結合する方法については、今後またトライしたいと思います。
guest

0

すべて商品名をインデックスにして.joinで結合すればよいです。

Python

1import pandas as pd 2from io import StringIO 3 4s = """product,sales_m 5apple,100 6orange,100 7grape,500 8banana,100""" 9df_m = pd.read_csv(StringIO(s), index_col='product') 10 11s = """product,sales_a 12apple,300 13orange,400 14banana,100 15melon,900""" 16df_a = pd.read_csv(StringIO(s), index_col='product') 17 18s = """product,sales_e 19apple,100 20orange,40 21grape,200 22melon,100""" 23df_e = pd.read_csv(StringIO(s), index_col='product') 24 25df = df_m.join([df_a, df_e]) 26df = df.fillna(0) 27print(df) 28""" 29 sales_m sales_a sales_e 30product 31apple 100.0 300.0 100.0 32orange 100.0 400.0 40.0 33grape 500.0 0.0 200.0 34banana 100.0 100.0 0.0 35"""

投稿2021/12/28 06:32

can110

総合スコア38341

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

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

Kozyma

2021/12/28 07:12

can110さま、早速アドバイスをくださり、ありがとうございます。 set_index(”product”)で商品名をindexにしてやってみたのですが、バリューエラーがでました。 ValueError: Indexes have overlapping values: Index(['sales'], dtype='object') #salesというのが売上の列名です。 これは、商品名以外もindexになってしまったのかなと思い、エクセルに出力して確認しましたが、indexになっているのはproductだけでした。 示していただいたコードで、ioは使ったことがなかったのでset_index()を使いましたが、その手順を飛ばしたのがいけなかったのでしょうか・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問