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

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

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

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

pandas

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

Q&A

解決済

1回答

6884閲覧

pandas apply 複数列 複数行の値を引数で

marymills

総合スコア18

Python

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

pandas

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

0グッド

0クリップ

投稿2019/09/11 07:07

編集2019/09/11 23:43

前提・実現したいこと

複数列 複数行の値を引数に関数に与えて帰ってきた値を新しい列で追加したい

4つの引数を与える関数があります
def my_func(x1, y1, x2, y2):

長いので処理省略

   
return R

pandasの
x1= A列の1行め
x2=B列の1行め
y1=A列の2行め
y2=B列の2行め
を引数でmy_funcの帰ってきた値を
R列1行めに追加したい

x1= A列の2行め
x2=B列の2行め
y1=A列の3行め
y2=B列の3行め
を引数でmy_funcの帰ってきた値を
R列2行めに追加したい
:::::

と最後の行までR列に値を入れたい

見つけて試そうと思ったコード

def func(row):
return row['A'] + row['B'] + row['C']

import pandas as pd
df = pd.DataFrame({'A':[1,2,3],'B':[10,20,30],'C':[100,200,300]})
df['D'] = df.apply( func, axis=1)
print (df)

⬆︎2行分の書き方がよくわかりませんでした

import pandas as pd
df = pd.DataFrame({ 'A' : [1, 2, 3, 4, 5], 'B' : [10, 20, 30, 40, 50] })

df['D'] = list(map(lambda x, y: x + y, df['A'], df['B'].shift(-1)))
print(df)

A B D
0 1 10 21.0
1 2 20 32.0
2 3 30 43.0
3 4 40 54.0
4 5 50 NaN

⬆︎
df['A'] + df['B'].shift(-1)
1+20
2+30
3+40
4+50

df['D'] = list(map(lambda x, y: x + y, df['A'], df['B'].shift(-1)))
を変えればいいのかなまでは理解できましたが
そのさきが思うようにできませんというよりどう書いていいかわからずといったところがです

発生している問題・エラーメッセージ

TypeError: ("'Series' object is not callable", 'occurred at index A')

該当のソースコード

試したこと

df["R"] = df.apply(func1(df['A'],df['B'], df['A'].shift(-1), df['B'].shift(-1)))

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

t_obara

2019/09/11 07:40

入力に対し、期待する出力を提示した方がよろしいかと。 あと、コードは```で囲ってください。
magichan

2019/09/11 07:45

いまひとつ仕様が明確ではありません。 2行目以降はどのように処理をするのでしょうか? 1行目をX に2行目をyに割り振る 2行目をX に3行目をyに割り振る 3行目をX に4行目をyに割り振る ・・・ と繰り返すのですか? それとも単純に 奇数行はX、偶数行はyに割り振る ということでしょうか? また後者の場合戻ってきた値を、奇数行と偶数行に同じ値を書き込むのですか?それとも奇数行にのみかきこむのですか?
meg_

2019/09/11 11:35

forループでの処理では駄目なのですか?
guest

回答1

0

ベストアンサー

質問の編集ありがとうございました。

今回の仕様の場合

  • 『複数行にapply()を適用する』

と考えるよりも

  • 『複数行をまとめたDataFrameを作成し、そろDataFrameに対してapply()を適用する』

と考える方がシンプルです。

データのまとめ方ですが、まず各行の1つ下の行はに書かれているように DataFrame.shift(-1) にて得ることができますので、
前処理として、'A'列と'B'列をshift(-1)した行をそれぞれ 'A2'列と'B2'列に名前を変更(rename())を行い、元のDataFrameに結合(join())します。
すると

Python

1import pandas as pd 2 3df = pd.DataFrame({ 'A' : [1, 2, 3, 4, 5], 'B' : [10, 20, 30, 40, 50] }) 4df = df.join(df[['A', 'B']].rename(columns={'A':'A2','B':'B2'}).shift(-1)) 5# A B A2 B2 6#0 1 10 2.0 20.0 7#1 2 20 3.0 30.0 8#2 3 30 4.0 40.0 9#3 4 40 5.0 50.0 10#4 5 50 NaN NaN

となりますので、このDataFrameの各行に対して apply() を適用すると良いだけとなります。
DataFrameの各列を関数 my_func(x1, y1, x2, y2)の各パラメータに対応させるには、lambda を経由して

Python

1df['R'] = df.apply(lambda row:f(row['A'],row['A2'],row['B'],row['B2']), axis=1)

または

Python

1df['R'] = df.apply(lambda row:f(*row[['A','A2','B','B2']]), axis=1)

の様に呼ぶことでの行えるかと思います。

あとは、もし'A2'列と'B2'列が不要であれば、以下のように削除するだけです。

Python

1df = df.drop(columns=['A2', 'B2'])

投稿2019/09/12 03:12

magichan

総合スコア15898

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

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

marymills

2019/09/12 05:57

行を増やすという発想が全くなかったのでありがとうございました。 出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問