【发布时间】:2019-10-20 14:18:30
【问题描述】:
我现在正在学习如何编写 Python 类和方法链。基本上,我想要一个 python (2.7) 类来保存我的数据并具有(可链接的)方法,允许我过滤数据而不改变我的原始数据。我做了一些谷歌搜索,似乎我的答案可能与return self 有关,但我不确定如何实现它以使这些方法不会改变我的原始数据。
假设我有一个数据存储在一个名为 file 的 excel 文件中,如下所示:
+--------+-----+-------+
| Person | Sex | Score |
+--------+-----+-------+
| A | M | 10 |
| B | F | 9 |
| C | M | 8 |
| D | F | 7 |
+--------+-----+-------+
我想编写一个名为MyData 的类,这样我就可以进行一些基本的数据调用和过滤。
这是我目前得到的
class MyData:
def __init__ (self, file):
import pandas as pd
self.data = pd.read_excel (file)
self.Person = self.data['Person']
self.Sex = self.data['Sex']
self.Score = self.data['Score']
def male_only(self):
self.data = self.data[self.Sex=="M"]
self.Person = self.Person[self.Sex=="M"]
self.Score = self.Score[self.Sex=="M"]
self.Sex = self.Sex[self.Sex=="M"]
return self
def female_only(self):
self.data = self.data[self.Sex=="F"]
self.Person = self.Person[self.Sex=="F"]
self.Score = self.Score[self.Sex=="F"]
self.Sex = self.Sex[self.Sex=="F"]
return self
这似乎可行,但遗憾的是,我的原始数据已被此代码永久变异。例如:
Data = MyData(file)
Data.data
>>> Data.data
Person Sex Score
0 A M 10
1 B F 9
2 C M 8
3 D F 7
Data.male_only().data
>>> Data.male_only().data
Person Sex Score
0 A M 10
2 C M 8
Data.data
>>> Data.data
Person Sex Score
0 A M 10
2 C M 8
我想要一个对Data.male_only().Person 和Data.Person.male_only() 或Data.male_only().data 和Data.data.male_only() 返回相同答案的类,而不会永久改变Data.data 或Data.Person。
【问题讨论】:
-
如果您不想改变调用这些方法的对象,那么显然您需要返回一个新对象,而不是
self。您当前的__init__()并不适合此,因为它只允许您从文件而不是现有数据框创建新的MyData。 -
@jasonharper 我对此很陌生,但我目前的理解是
return self对于方法链接是必不可少的......一个代码示例返回相同的答案Data.male_only().Person和Data.Person.male_only()不永久更改Data.Person将不胜感激。非常感谢。
标签: python pandas python-2.x method-chaining