Я согласен с @ Demi-Lune.
Я изменил код OP, чтобы методы male_only()
и female_only()
всегда возвращали копию принадлежащего ему объекта. И я изменил __init__()
метод, потому что я думаю, что вы не хотите вызывать pd.read_csv()
метод каждый раз, когда создаете этот новый объект. Так что male_only()
и female_only()
метод всегда возвращают новый объект, это не повлияет на другие объекты.
import pandas as pd
# Added for creating file on memory.
import io
csv = '''Person,Sex,Score
p1,M,1
p2,M,2
p3,M,3
p4,F,4
p5,F,5
p6,F,6'''
file = io.StringIO(csv)
class MyData:
def __init__ (self, file=None, data=None):
import pandas as pd
if file:
self.data = pd.read_csv(file)
else:
self.data = data
self.Person = self.data['Person']
self.Sex = self.data['Sex']
self.Score = self.data['Score']
def copy_d(self):
return MyData(data=self.data.copy())
def male_only(self):
d = self.copy_d()
d.data = self.data[self.Sex=="M"]
d.Person = self.Person[self.Sex=="M"]
d.Score = self.Score[self.Sex=="M"]
d.Sex = self.Sex[self.Sex=="M"]
return d
def female_only(self):
d = self.copy_d()
d.data = self.data[self.Sex=="F"]
d.Person = self.Person[self.Sex=="F"]
d.Score = self.Score[self.Sex=="F"]
d.Sex = self.Sex[self.Sex=="F"]
return d
d = MyData(file)
print(d.female_only().data)
# Person Sex Score
# 3 p4 F 4
# 4 p5 F 5
# 5 p6 F 6
print(d.male_only().data)
# Person Sex Score
# 0 p1 M 1
# 1 p2 M 2
# 2 p3 M 3
print(d.data)
# Person Sex Score
# 0 p1 M 1
# 1 p2 M 2
# 2 p3 M 3
# 3 p4 F 4
# 4 p5 F 5
# 5 p6 F 6
Но если вы просто используете pandas.DataFrame
, другой подход просто использует голый pandas.DataFrame
,Во-первых, в большинстве случаев объект pandas.DataFrame
уже имеет имя свойства, равное имени столбца. Так что на самом деле вам не нужно определять свойства, такие как Person
, Sex
, Score
, потому что они уже существуют в объекте DataFrame.
т.е.:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.eye(3,3), columns=['Person', 'Sex', 'Score'])
# `df` already has these properteis.
df.Person
df.Sex
df.Score
# In [986]: df.Person
# Out[986]:
# 0 1.0
# 1 0.0
# 2 0.0
# Name: Person, dtype: float64
# In [987]: df.Sex
# Out[987]:
# 0 0.0
# 1 1.0
# 2 0.0
# Name: Sex, dtype: float64
# In [988]: df.Score
# Out[988]:
# 0 0.0
# 1 0.0
# 2 1.0
# Name: Score, dtype: float64
Так, ваши male_only()
и female_only()
методы написаны следующим образом.
import pandas as pd
# Added for creating file on memory.
import io
csv = '''Person,Sex,Score
p1,M,1
p2,M,2
p3,M,3
p4,F,4
p5,F,5
p6,F,6'''
file = io.StringIO(csv)
def male_only(df):
return df[df.Sex=='M']
def female_only(df):
return df[df.Sex=='F']
df = pd.read_csv(file)
male_only(df)
# In [1034]: male_only(df)
# Out[1037]:
# Person Sex Score
# 0 p1 M 1
# 1 p2 M 2
# 2 p3 M 3
female_only(df)
# In [1038]: female_only(df)
# Out[1041]:
# Person Sex Score
# 3 p4 F 4
# 4 p5 F 5
# 5 p6 F 6
Надеюсь, это поможет вам.