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

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

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

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

pandas

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

Q&A

解決済

2回答

770閲覧

【Python】データフレームに新しいカラムを追加する際に最終行とそれ以外の行で異なる処理をしたい。

mashita_takuo

総合スコア3

Python

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

pandas

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

0グッド

0クリップ

投稿2020/09/03 03:55

既存のデータフレームで、新たなカラムを追加して、最終行だけカラム間で計算させた値を代入して、その他の行には0を代入するという処理するコードについてご教示いただければ幸いです。

例えば、下のようなdfについて新しいカラム['c']を追加する際に、最終行だけ df['c'] = df['a'] + df['b'] という処理をおこない、その他の行については df['c'] = 0 の処理をおこないたいという内容です。

import pandas as pd
df = pd.DataFrame({'a': [1, 2, 3],'b': [4, 5, 6]})
newdf = pd.DataFrame({'a': [1, 2, 3],'b': [4, 5, 6],'c': [0, 0, 9]})

非常にシンプルな内容かと思いますが、中々、自分で解決できずにいます。
お手数ですがどうぞよろしくお願いします。

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

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

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

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

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

guest

回答2

0

whereを使って、最終行以外を0で置き換えるとできます。

python

1import pandas as pd 2df = pd.DataFrame({'a': [1, 2, 3],'b': [4, 5, 6]}) 3 4df['c'] = (df['a'] + df['b']).where(df.index == df.index[-1], 0)

追記

データ量や計算量が多い場合など、最初に0でc列を作るやり方は、こう書くとうまくいくと思います。

python

1import pandas as pd 2df = pd.DataFrame({'a': [1, 2, 3],'b': [4, 5, 6]}) 3 4df['c'] = 0 5last_idx = df.index[-1] 6df.loc[last_idx, 'c'] = df.loc[last_idx, 'a'] + df.loc[last_idx, 'b']

投稿2020/09/03 04:52

編集2020/09/03 06:14
bsdfan

総合スコア4794

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

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

mashita_takuo

2020/09/03 05:50

ご回答ありがとうございます。 実際に加工しているデータでもうまくいきました。助かりました。 追加で質問なのですが、こちらの処理は内部で全行について一度(df['a'] + df['b'])を計算させているのでしょうか。今回の例ではデータ量が小さく、シンプルな値の足し算だったため全く問題ないのですが、データが大量で計算が複雑である場合に非効率となることはないのでしょうか。
bsdfan

2020/09/03 05:58

おっしゃるとおり、一度全ての行に対して計算をしています。なので、行数や計算内容によっていは効率が悪くなることはあり得ます。 その場合は、jeanbiegoさんの回答にあるように、列全体を0で作っておいて、必要な部分だけ計算したほうが良いでしょう。
mashita_takuo

2020/09/03 07:16

ご返信ありがとうございました。 いろいろなやり方が知れて勉強になりました。
guest

0

ベストアンサー

0の列つくって、最終行だけ合計するのでもいいんですか?

python3

1import pandas as pd 2df = pd.DataFrame({'a': [1, 2, 3],'b': [4, 5, 6]}) 3new_df = df 4new_df["c"] = 0 5new_df["c"][-1:] = new_df["a"][-1:] + new_df["b"][-1:] 6print(new_df) 7# a b c 8#0 1 4 0 9#1 2 5 0 10#2 3 6 9

投稿2020/09/03 04:37

jeanbiego

総合スコア3966

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

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

mashita_takuo

2020/09/03 05:40

ご回答いただきありがとうございます。 ただ、私も最初そのような形で書いていたのですが、実際に加工しているデータでは以下のようなエラーメッセージが出てしまい、うまく処理できませんでした。 SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame TypeError: 'slice(-1, None, None)' is an invalid key ValueError: cannot set using a slice indexer with a different length than the value エラーメッセージから原因を読み解くのがどうしても不慣れのため、あきらめて別の方法に逃げようとしていました。 私の例に書いたシンプルなデータだとご指摘いただいたコードで処理できているので、元のdataframeに問題があるのでしょうね。 お手数お掛け致しました。
jeanbiego

2020/09/03 06:22

実際に書かれたコードとdataframeは載せれますか?
jeanbiego

2020/09/03 06:22

あと、とりあえずエラーメッセージでググって、同じような人をみつけてエラーの意味を探るのも手ですよ。
mashita_takuo

2020/09/03 07:14

大変失礼しました。データを載せるのは難しいですが、 TypeError: 'slice(-1, None, None)' is an invalid key ValueError: cannot set using a slice indexer with a different length than the value ↑このエラーについては私の単純なミスがありました。 また、 SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame についてはググればいくつか出てきましたので、独力で解決してみたいと思います。 ご返信ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問