我是使用该课程的新手。我在使用课时遇到问题。像这样的代码:
import numpy as np
import pandas as pd
class Weather(object):
@property
def url(self):
return self._url
@url.setter
def url(self, value):
if value == 'GZ' or value == 'ZH' or value == 'ALL':
self._url = value
else:
raise ValueError('parameter Error')
def print_df(self):
df_em = pd.DataFrame()
df = pd.DataFrame({'k1': [1, 2, 3],
'k2': [2, 3, 4]})
for self._url in ['GZ', 'ZH']:
df['val'] = self._url
df_em = df_em.append(df, ignore_index=True)
if self._url == 'ALL':
print df_em
else:
print df_em[df_em.val == self._url]
s = Weather()
s.url = 'ZH'
s.print_df()
我更改属性s.url == 'GZ'
或s.url == 'ALL'
时得到的结果:
k1 k2 val
0 1 2 ZH
1 2 3 ZH
2 3 4 ZH
我想得到的结果:
s.url = 'ZH'
s.print_df()
k1 k2 val
0 1 2 ZH
1 2 3 ZH
2 3 4 ZH
s.url = 'GZ'
s.print_df()
k1 k2 val
0 1 2 GZ
1 2 3 GZ
2 3 4 GZ
s.url = 'ALL'
s.print_df()
k1 k2 val
0 1 2 GZ
1 2 3 GZ
2 3 4 GZ
3 1 2 ZH
4 2 3 ZH
5 3 4 ZH
我不知道错误发生在哪里。谢谢!
答案 0 :(得分:2)
修复代码的最简单方法是替换:
for self._url in ['GZ', 'ZH']:
df['val'] = self._url
带
for url in ['GZ', 'ZH']:
df['val'] = url
然后它有效。
它没有用,因为您正在更改受保护的属性self._url
,该属性应包含您要显示的网址。
此外,您正在构建打印部分中的DataFrame,我不会说这是优雅的。我会像上课那样去上课:
import pandas as pd
class Weather(object):
def __init__(self):
# Attribute initialization
self.df_em = self._construct_df()
# Constant initialization
self._url = None
def _construct_df(self):
df_em = pd.DataFrame()
df = pd.DataFrame({'k1': [1, 2, 3],
'k2': [2, 3, 4]})
for url in ['GZ', 'ZH']:
df['val'] = url
df_em = df_em.append(df, ignore_index=True)
return df_em
@property
def url(self):
return self._url
@url.setter
def url(self, value):
if value in ['GZ', 'ZH', 'ALL']:
self._url = value
else:
raise ValueError('parameter Error')
def print_df(self):
if self.url == 'ALL':
print self.df_em
else:
print self.df_em[self.df_em.val == self.url]
分割了构造和显示部分。