python类如果value =='ALL'获取所有值

时间:2017-05-16 09:13:01

标签: python class pandas

我是使用该课程的新手。我在使用课时遇到问题。像这样的代码:

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

我不知道错误发生在哪里。谢谢!

1 个答案:

答案 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]

分割了构造和显示部分。