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

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

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

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

pandas

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

Q&A

解決済

2回答

486閲覧

Pythonで列内の複数の文字列と一致するものをグループ分けして更に別列の数字を合計したいです。

tatsu2

総合スコア3

Python

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

pandas

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

0グッド

0クリップ

投稿2021/04/14 01:59

前提・実現したいこと

完全に初心者で恐縮ですが調べてもどうしてもわからなかったので質問させていただきます。
以下のcsvを特定の条件に分類分けし、金額の合計を別のExcelに出力したいと考えております。

条件
製品をグループ化
更に区分内を(本体価格と消費税)、(手数料)となるようグループ化
更に国を(JP)、(JP以外)となるようグループ化
最後にそれぞれグループ分けされた金額の数字をsumしてExcelに出力

該当のソースコード

製品名 区分   国  金額 製品A 本体価格 JP  xxxx 製品A 消費税  JP  xxxx 製品A 手数料  JP  xxxx 製品A 本体価格 US  xxxx 製品A 消費税  US  xxxx 製品A 手数料  US  xxxx 製品A 本体価格 HK  xxxx 製品A 消費税  HK  xxxx 製品A 手数料  HK  xxxx 製品B 本体価格 JP  xxxx 製品B 消費税  JP  xxxx 製品B 手数料  JP  xxxx 製品C 本体価格 JP  xxxx 製品C 消費税  JP  xxxx 製品C 手数料  JP  xxxx

試したこと

import pandas as pd
import openpyxl

df = pd.read_csv("C:\Users\userA\Desktop\売上データ.csv", encoding = "shift-jis")

pd.set_option('display.max_rows', None)

df = df.groupby(["製品名","区分","国"])

df.sum().to_excel('C:\Users\userA\Desktop\出力先.xlsx', sheet_name='data')

これである程度の金額の合計は出せるのですが、区分と国がバラバラになっており、想定していたことができておりません。。。

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

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

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

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

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

aqufiz

2021/04/14 04:13

どのようにバラバラになっているか結果を貼って頂きたいです.
ppaul

2021/04/14 04:47

期待通りの結果が得られないということだと思いますが、tatsu2さんが期待するものが何なのかが書かれていないので答えようがありません。 回答を求めるなら、どういう出力を期待しているのかを質問に追加しましょう。
tatsu2

2021/04/14 04:50 編集

ご返信ありがとうございます。以下のようになります。 製品名 区分   国 金額 製品A 本体価格 JP  xxxx          US xxxx            HK xxxx 製品A 消費税  JP  xxxx          US xxxx           HK xxxx 製品A 手数料  JP  xxxx          US xxxx           HK xxxx ・ ・ ・ 各製品ごとに同じようになる ソースコードの部分に記載が漏れてわかりにくくなっており大変申し訳ないのですが、 1つの製品が1つ売れる毎に価格、消費税、手数料が1つずつcsvに記載されるため、 csv内には同じデータが大量に存在します。 それを合計して毎月どのくらい売れたのかをJP、JP以外で取りまとめたいのが今回の趣旨となります
tatsu2

2021/04/14 04:55

理想的な出力結果は以下となります 製品名 区分       国   合計金額 製品A 本体価+消費税  JP   xxxx 製品A 手数料      JP   xxxx 製品A 本体価+消費税  JP以外 xxxx 製品A 手数料      JP以外 xxxx ・ ・ ・ 各製品ごとに同じ処理をする 分かりにくくて申し訳ありません。 このような結果を想定しております 【本体価格+消費税】や【JP以外】は別の名前にリネームする等ができると嬉しいです
guest

回答2

0

ベストアンサー

データは適当ですが、以下のような感じでしょうか。

元データ

python

1>>> print(df) 2 製品名 区分 国 金額 30 製品A 本体価格 JP 1000 41 製品A 消費税 JP 100 52 製品A 手数料 JP 10 63 製品A 本体価格 US 800 74 製品A 消費税 US 70 85 製品A 手数料 US 300 96 製品A 本体価格 HK 3000 107 製品A 消費税 HK 150 118 製品A 手数料 HK 500 129 製品B 本体価格 JP 1800 1310 製品B 消費税 JP 180 1411 製品B 手数料 JP 2000 1512 製品C 本体価格 JP 500 1613 製品C 消費税 JP 50 1714 製品C 手数料 JP 600 1815 製品A 本体価格 JP 1500 1916 製品A 消費税 JP 150 2017 製品A 手数料 JP 15 2118 製品A 本体価格 US 1600 2219 製品A 消費税 US 140 2320 製品A 手数料 US 600 2421 製品B 本体価格 JP 1200 2522 製品B 消費税 JP 120 2623 製品B 手数料 JP 2000 2724 製品B 本体価格 HK 1000 2825 製品B 消費税 HK 60 2926 製品B 手数料 HK 200 3027 製品C 本体価格 JP 900 3128 製品C 消費税 JP 90 3229 製品C 手数料 JP 300

変換処理

python

1class_d = {'本体価格': '本体価格+消費税', '消費税': '本体価格+消費税', '手数料': '手数料'} 2 3df['大区分'] = df['区分'].apply(lambda x: class_d[x]) 4df['国内外'] = df['国'].apply(lambda x: 'JP' if x=='JP' else 'JP以外') 5df.drop(['区分', '国'], axis=1, inplace=True) 6df_temp = df.groupby(['製品名', '国内外', '大区分']).sum() 7df_temp2 = df_temp.reset_index().reindex(columns=['製品名', '大区分', '国内外', '金額']) 8df_result = df_temp2.sort_values(['製品名', '国内外', '大区分'], ascending=[True, True, False]) 9df_result.columns = ['製品名', '区分', '国', '合計金額']

実行結果

python

1>>> class_d = {'本体価格': '本体価格+消費税', '消費税': '本体価格+消費税', '手数料': '手数料'} 2>>> 3>>> df['大区分'] = df['区分'].apply(lambda x: class_d[x]) 4>>> df['国内外'] = df['国'].apply(lambda x: 'JP' if x=='JP' else 'JP以外') 5>>> df.drop(['区分', '国'], axis=1, inplace=True) 6>>> df_temp = df.groupby(['製品名', '国内外', '大区分']).sum() 7>>> df_temp2 = df_temp.reset_index().reindex(columns=['製品名', '大区分', '国内外', '金額']) 8>>> df_result = df_temp2.sort_values(['製品名', '国内外', '大区分'], ascending=[True, True, False]) 9>>> df_result.columns = ['製品名', '区分', '国', '合計金額'] 10>>> print(df_result) 11 製品名 区分 国 合計金額 121 製品A 本体価格+消費税 JP 2750 130 製品A 手数料 JP 25 143 製品A 本体価格+消費税 JP以外 5760 152 製品A 手数料 JP以外 1400 165 製品B 本体価格+消費税 JP 3300 174 製品B 手数料 JP 4000 187 製品B 本体価格+消費税 JP以外 1060 196 製品B 手数料 JP以外 200 209 製品C 本体価格+消費税 JP 1540 218 製品C 手数料 JP 900

投稿2021/04/14 05:50

ppaul

総合スコア24666

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

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

tatsu2

2021/04/14 06:58

ありがとうございます!!想定していたことができました。 分かりにくい質問だったのに大変助かりました。
guest

0

python

1 2import pandas as pd 3 4dat = [ 5["製品A","本体価格","JP",500], 6["製品A","消費税","JP",5], 7["製品A","手数料","JP",50], 8["製品A","本体価格","US",50], 9["製品A","消費税","US",5], 10["製品A","手数料","US",50], 11["製品A","本体価格","HK",50], 12["製品A","消費税","HK",5], 13["製品A","手数料","HK",50], 14["製品B","本体価格","JP",80], 15["製品B","消費税","JP",8], 16["製品B","手数料","JP",5], 17["製品C","本体価格","JP",90], 18["製品C","消費税","JP",9], 19["製品C","手数料","JP",50], 20] 21 22df = pd.DataFrame(dat, columns=["製品名","区分","国","金額"]) 23print(df) 24 25isjp = df.loc[:,'国']=="JP" 26print(isjp) 27isfee = df.loc[:,'区分']=="手数料" 28 29g = df.groupby(["製品名", isjp, isfee]) 30for val in g: 31 print(val) 32 33

とりあえずこんな感じにすれば、グルーピングはできます。

投稿2021/04/14 04:57

t_obara

総合スコア5488

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問