🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

pandas

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

Q&A

解決済

1回答

1242閲覧

pandasのデータフレームの特定の行に値を一律に追加したい

loreeeee

総合スコア40

Python

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

pandas

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

0グッド

0クリップ

投稿2021/01/18 14:42

前提・実現したいこと

以下のソースコードにて、df2で果物の種類ごとに集計した値をdfの値に足し算したいのですが、
dfの値が更新されません。エラーメッセージはなくプログラム自体は回るのですが、値を反映させるにはどのように集計したらよいのでしょうか。

○作業の具体例
kind = appleの場合
1.df2のnumberでappleの文を足し算(10+12=22)
2.この値をdf1のappleの行のnumberに足し算する

該当のソースコード

python

1 2import pandas as pd 3import numpy as np 4 5 6df = pd.DataFrame({"number": np.arange(10), 7"kind":["apple", "banana", "apple", "apple","apple", "banana", "apple", "apple","sour", "sour"]}) 8 9# number kind 10#0 0 apple 11#1 1 banana 12#2 2 apple 13#3 3 apple 14#4 4 apple 15#5 5 banana 16#6 6 apple 17#7 7 apple 18#8 8 sour 19#9 9 sour 20 21 22df2 = pd.DataFrame({"number": [10,12, 200, 50], 23"kind":["apple", "apple", "banana", "sour"], 24"date":["JAN","FEB","MAR","MAR"]}) 25 26# number kind date 27#0 10 apple JAN 28#1 12 apple FEB 29#2 200 banana MAR 30#3 50 sour MAR 31 32 33#df2の果物の種類に対応するnumberをdf1の同じ果物のnumbeに足し算したい 34kind_list = ["apple","banana","sour"] 35for fruit in kind_list: 36 df.query("kind==@fruit").loc[:, "number"] += df2.query("kind==@fruit").sum()["number"] 37 print(df.query("kind==@fruit").loc[:, "number"]) 38 print(df2.query("kind==@fruit").sum()["number"]) 39 40#なぜかdfが更新されない... 41print(df) 42# number kind 43#0 0 apple 44#1 1 banana 45#2 2 apple 46#3 3 apple 47#4 4 apple 48#5 5 banana 49#6 6 apple 50#7 7 apple 51#8 8 sour 52#9 9 sour

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

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

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

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

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

guest

回答1

0

ベストアンサー

df.query("kind==@fruit") の返り値は df とは実態が別のコピーです。
そのコピーにたいして、df.query("kind==@fruit").loc[:, "number"] += df2.query("kind==@fruit").sum()["number"] としても変更されているのは query() が返したコピーであり、元の df には影響しません。

pandas のほとんどの関数はコピーを返すようになっていて、元の DataFrame は変更されません。(一部の関数は inplace=True を指定すると元の DataFrame が変更されます。)

その点を踏まえて修正すると、以下のようになります。

python

1import pandas as pd 2import numpy as np 3 4df = pd.DataFrame( 5 { 6 "number": np.arange(10), 7 "kind": [ 8 "apple", 9 "banana", 10 "apple", 11 "apple", 12 "apple", 13 "banana", 14 "apple", 15 "apple", 16 "sour", 17 "sour", 18 ], 19 } 20) 21 22df2 = pd.DataFrame( 23 { 24 "number": [10, 12, 200, 50], 25 "kind": ["apple", "apple", "banana", "sour"], 26 "date": ["JAN", "FEB", "MAR", "MAR"], 27 } 28) 29 30df_by = df2.groupby("kind").sum() 31for row in df_by.itertuples(): 32 df.loc[df["kind"] == row.Index, "number"] += row.number 33 34print(df) 35# number kind 36# 0 22 apple 37# 1 201 banana 38# 2 24 apple 39# 3 25 apple 40# 4 26 apple 41# 5 205 banana 42# 6 28 apple 43# 7 29 apple 44# 8 58 sour 45# 9 59 sour

投稿2021/01/18 15:29

編集2021/01/18 15:29
tiitoi

総合スコア21956

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

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

loreeeee

2021/01/23 04:57

>df.query("kind==@fruit") の返り値は df とは実態が別のコピーです。 ここの理解がかけておりました。ビューを返すのかコピーを返すのかその都度意識してみます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問