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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

Python

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

pandas

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

Q&A

解決済

2回答

1132閲覧

複数のデータフレームを組み合わせたあと、その中の数値を使って計算する

SatokoM

総合スコア4

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

Python

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

pandas

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

0グッド

0クリップ

投稿2020/07/09 02:19

Python、Pandasを使ったデータフレーム結合とその中の数値を使った計算に関する質問です。

下記のような色々な種類の果物と野菜の入ったバスケットをDF_1と仮定しています。

BascketGrapeAppleOrangeCucumberCarrot
0505000100
1020805050
2070307030

各果物と野菜は下記DF_2のような属性を持っています。

NameWeightPriceSuger_content
0Grape105003
1Apple202005
2Orange151002
3Cucumber5501
4carrot132004

この二つのDFを組み合わせて以下のようにバスケットごとの属性を整理したいのですがうまくいきません。
fruitはfruitだけのWeight, Price, Suger contentでまとめてVegetableはVegetableのみでまとめたいです。
表には説明のため計算式を書いていますが、結果が表示されるようにしたいです。

Bascket|Grape|Apple|Orange|Cucumber|carrot|fruit_weight|fruit_price|fruit_Scontent|vege_weight|vege_price|vege_Scontent
|:--:|:--:|:--:|:--:|:--:|:--:
0|50|50|0|0|100|=1050/100+2050/100|=50050/100+20050/100|=350/100+550/100|=13100/100|=200100/100|=4100/100
1|0|20|80|50|50|=20
20/100+1580/100|=20020/100+10080/100|=520/100+280/100|=550/100+1350/100|=5050/100+20050/100|=150/100+4*50/100
2|0|70|30|70|30|...|...|...|...|...|...|

該当のソースコード

Python

1for i, _ in df_1.iterrows(): 2 for i2, _ in df_2.iterrows(): 3 if df_2['Name'][i] in df_1.columns: 4 df_1[i].append(df_2[i2])

試したこと

まずはDF_1とDF_2をつなげることからだと思い、上記のコードで結合しようとしたのですがkeyエラーが出てしまいそこから先に進めなくなってしまいました。
PriceやWeightの計算をするまで段階を経て進めていかなければならないことなのにすでに第一段階で躓いてしまい困っています。
ご助言を頂けると幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

果物と野菜の分類の部分で少しコードがややこしくなっていますが、掛け算して足すだけなので容易に可能です。

python

1import io 2 3import pandas as pd 4 5txt = """ 6Bascket,Grape,Apple,Orange,Cucumber,Carrot 70,50,50,0,0,100 81,0,20,80,50,50 92,0,70,30,70,30 10""" 11df = pd.read_csv(io.StringIO(txt)) 12 13txt2 = """ 14Name,Weight,Price,Suger_content 15Grape,10,500,3 16Apple,20,200,5 17Orange,15,100,2 18Cucumber,5,50,1 19Carrot,13,200,4 20""" 21df2 = pd.read_csv(io.StringIO(txt2)) 22 23 24df 25# Bascket Grape Apple Orange Cucumber Carrot 26# 0 0 50 50 0 0 100 27# 1 1 0 20 80 50 50 28# 2 2 0 70 30 70 30 29df2 30# Name Weight Price Suger_content 31# 0 Grape 10 500 3 32# 1 Apple 20 200 5 33# 2 Orange 15 100 2 34# 3 Cucumber 5 50 1 35# 4 Carrot 13 200 4

このとき、

python

1groups = {'fruit': ['Grape', 'Apple', 'Orange'], 2 'vege': ['Cucumber', 'Carrot']} 3 4values = df.mul(df2.set_index('Name').unstack(), level=1) 5sums = [values.loc[:, (slice(None), cols)] 6 .sum(axis=1, level=0) 7 .rename(columns=lambda n: groupname + '_' + n) / 100 8 for groupname, cols in groups.items()] 9pd.concat([df, *sums], axis=1) 10# Bascket Grape Apple Orange ... fruit_Suger_content vege_Weight vege_Price vege_Suger_content 11# 0 0 50 50 0 ... 4.0 13.0 200.0 4.0 12# 1 1 0 20 80 ... 2.6 9.0 125.0 2.5 13# 2 2 0 70 30 ... 4.1 7.4 95.0 1.9

投稿2020/07/10 04:13

kirara0048

総合スコア1399

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

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

0

ベストアンサー

縦も横もサイズの違うdataframeを結合するのは、面倒な気がします。
果物&野菜の各情報は辞書型にして呼び出したほうがわかりやすのではないでしょうか。
参考にコード載せておきます。

python3

1import pandas as pd 2import numpy as np 3 4# テスト用データ作成 5import io 6txt = """ 7Bascket Grape Apple Orange Cucumber Carrot 80 50 50 0 0 100 91 0 20 80 50 50 102 0 70 30 70 30 11""" 12df = pd.read_table(io.StringIO(txt), sep="\t") 13print(df) 14""" 15Bascket Grape Apple Orange Cucumber Carrot 160 0 50 50 0 0 100 171 1 0 20 80 50 50 182 2 0 70 30 70 30 19""" 20 21txt2 = """ 22Name Weight Price Suger_content 230 Grape 10 500 3 241 Apple 20 200 5 252 Orange 15 100 2 263 Cucumber 5 50 1 274 Carrot 13 200 4 28""" 29df2 = pd.read_table(io.StringIO(txt2), sep="\s*\t+") 30d = df2.set_index('Name').T.to_dict() 31print(d) 32""" 33{'Grape': {'Weight': 10, 'Price': 500, 'Suger_content': 3}, 'Apple': {'Weight': 20, 'Price': 200, 'Suger_content': 5}, 'Orange': {'Weight': 15, 'Price': 100, 'Suger_content': 2}, 'Cucumber': {'Weight': 5, 'Price': 50, 'Suger_content': 1}, 'Carrot': {'Weight': 13, 'Price': 200, 'Suger_content': 4}} 34""" 35 36# ここから処理 37 38def cal(x, e, f_v): 39 #global e 40 if f_v == "Vege": 41 names = ["Cucumber", "Carrot"] 42 else: 43 names = ["Grape", "Apple", "Orange"] 44 sum_e = 0 45 for v in names: 46 sum_e += x[v]*d[v][e]/100 47 return sum_e 48fruit_vege = ["Fruit", "Vege"] 49es = ["Weight", "Price", "Suger_content"] 50 51for f_v in fruit_vege: 52 for e in es: 53 df[f"{f_v}_{e}"]=np.nan 54 df[f"{f_v}_{e}"] = df.apply(cal, e=e, f_v=f_v, axis=1) 55print(df) 56""" 57 Bascket Grape Apple Orange Cucumber Carrot Fruit_Weight Fruit_Price \ 580 0 50 50 0 0 100 15.0 350.0 591 1 0 20 80 50 50 16.0 120.0 602 2 0 70 30 70 30 18.5 170.0 61 62 Fruit_Suger_content Vege_Weight Vege_Price Vege_Suger_content 630 4.0 13.0 200.0 4.0 641 2.6 9.0 125.0 2.5 652 4.1 7.4 95.0 1.9 66"""

投稿2020/07/09 06:38

編集2020/07/09 06:41
jeanbiego

総合スコア3966

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

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

SatokoM

2020/07/09 07:31

ありがとうございます。 仰る通りで縦も横もサイズの違うDFをどうやって結合するかに気を取られており、辞書にするのは思いつきもしませんでした。 目的の形にできて本当に助かりました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問