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

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

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

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

pandas

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

Q&A

解決済

2回答

1171閲覧

Pythonでクラスを使って行方向の計算をしたい

morimori_4

総合スコア22

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2022/06/16 11:46

Python pandasで複数データフレームを使うために、クラスを使いたいです。
従来、データフレームの行方向の計算をする関数をapplyで使っていました。
これをクラス内に作りたいのですが、クラスを使った場合の行方向の指示の仕方がわかりません。
基本的な質問で申し訳ないのですが、教示いただけるを幸いです。

実現したいこと

クラスを使ってデータフレームの行方向の計算をして列を追加したい。
(以下のコードでcol2列の値を1行ずらして新しい列に入れたい)

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

クラスで行方向の計算の記載方法がわからない。

エラーメッセージ NameError: name 'x' is not defined

該当のソースコード

python

1import pandas as pd 2data={'col1' : [4,12,2,14,15,16], 3 'col2' : [4,12,2,14,15,16]} 4df =pd.DataFrame(data) 5 6# col2を1行ずらす(従来のclassを使わない方法) 7def test(x): 8 if x.name == 0: 9 df['test'] = np.nan 10 elif x.name >= 1: 11 df.loc[x.name, 'test'] = df.loc[x.name-1,'col2'] 12 13df.apply(test, axis=1) 14 15### 試したこと 16# 上記の関数をclassに入れたいが、xの指示方法がわからない 17class TestCol: 18 def __init__(self, x): 19 self.x = x 20 def rowmove(self,x): 21 if self.x.name == 0: 22 df['test'] = np.nan 23 elif self.x.name >= 1: 24 df.loc[self.x.name, 'test'] = df.loc[self.x.name-1,'col2'] 25 26testclass = TestCol(x) 27testclass.rowmove() 28

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

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

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

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

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

melian

2022/06/16 12:57

参考までに、「col2を1行ずらす」のは、 df['test'] = df['col2'].shift() としてもできます。
morimori_4

2022/06/17 01:27

簡単化のために「col2を1行ずらす」サンプルを掲載しましたが、実際はずらす方法が条件分岐になっており.shift(n)の形だと処理できないため、この前提は変更なしでお願いいたします。
guest

回答2

0

以下は pandas.DataFrame クラスを継承する方法です。

python

1import pandas as pd 2 3class TestCol(pd.DataFrame): 4 @property 5 def _constructor(self): 6 return TestCol 7 8 def rowmove(self, col_src, col_dst, n=1): 9 self[col_dst] = self[col_src].shift(n) 10 11if __name__ == '__main__': 12 data={'col1' : [4,12,2,14,15,16], 13 'col2' : [4,12,2,14,15,16]} 14 15 test_instance = TestCol(data) 16 test_instance.rowmove('col2', 'test') 17 print(test_instance) 18 19# 20 col1 col2 test 210 4 4 NaN 221 12 12 4.0 232 2 2 12.0 243 14 14 2.0 254 15 15 14.0 265 16 16 15.0

投稿2022/06/16 13:09

編集2022/06/16 13:30
melian

総合スコア19618

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

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

morimori_4

2022/06/16 13:35

回答ありがとうございます。 勉強不足で申し訳ないのですが、中段の if __name__ == '__main__': data={'col1' : [4,12,2,14,15,16], はどういう処理をされているのでしょうか?
melian

2022/06/16 13:42

このソースコードを他のファイルから import すると、クラス定義だけが読み込まれて if __name__ == '__main__': 以下のコードは実行されません。import ではなく、このソースコードを実行する場合にのみ実行されます。
morimori_4

2022/06/16 14:43

回答ありがとうございます。 私のレベルの上を行く回答をいただいており理解ができず恐縮なのですが、 今回、クラスの前で2種類のデータフレームを作成して、 test_instance1 = TestCol(データフレーム1) test_instance2 = TestCol(データフレーム2) test_instance1.rowmove('col2', 'test') test_instance2.rowmove('col2', 'test') のように実行する予定なのですが、その場合はこれを記載しないと問題があるのでしょうか?
melian

2022/06/16 14:50

いえ、問題ありません。
morimori_4

2022/06/16 23:47 編集

回答ありがとうございます。とても勉強になりました。 簡単化のために「col2を1行ずらす」サンプルを掲載しましたが、ずらす方法が条件分岐になっており.shift(n)の形だと処理できなかったので今回の形としております。 https://teratail.com/questions/o1n5ccy9jvaoza (以前にも回答いただき感謝しております)
guest

0

自己解決

python

1class TestCol: 2 def __init__(self, dataframe): 3 self.df = dataframe 4 5 def main(self,x): 6 if x.name == 0: 7 self.df['test'] = np.nan 8 elif x.name >= 1: 9 self.df.loc[x.name, 'test'] = self.df.loc[x.name-1,'col2'] 10 11 def rowmove(self): 12 self.df.apply(self.main, axis=1)

投稿2022/06/17 06:23

morimori_4

総合スコア22

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問