【问题标题】:Method to grab Pandas columns Python抓取 Pandas 列 Python 的方法
【发布时间】:2020-03-30 19:57:26
【问题描述】:

我正在尝试学习 OOP,并想转换一些我有的代码。

我的代码:

import pandas as pd
from matplotlib import pyplot as plt
import numpy as np

# assign previous day to variable, then group and sum
prev_day = pd.read_csv('C:/Users/Name/PycharmProjects/Corona Stats/TimeSeries/03-28-2020.csv')
prev_day = prev_day.replace(np.nan, 'Other', regex=True)
prev_day = prev_day.groupby(['Country_Region']).sum()
prev_day = prev_day.reset_index()

# assign current day to variable, removed unwanted columns, then group and sum
stats_reader = pd.read_csv('C:/Users/Name/PycharmProjects/Corona Stats/TimeSeries/03-29-2020.csv')
stats_reader = stats_reader.replace(np.nan, 'Other', regex=True)
stats_clean = stats_reader.drop(['FIPS', 'Last_Update', 'Lat', 'Long_'], axis=1)
stats_clean = stats_clean.rename(columns={
    'Admin2': 'County', 'Province_State': 'State', 'Country_Region': 'Country', 'Combined_Key': 'City'})
stats_clean = stats_clean.groupby(['Country']).sum()
stats_clean = stats_clean.reset_index()

# add in new columns to show difference between days
stats_clean['New Cases'] = stats_clean['Confirmed'] - prev_day['Confirmed']
stats_clean['New Deaths'] = stats_clean['Deaths'] - prev_day['Deaths']
stats_clean['New Recovered'] = stats_clean['Recovered'] - prev_day['Recovered']
stats_clean = stats_clean[[
    'Country', 'Confirmed', 'New Cases',
    'Deaths', 'New Deaths', 'Recovered', 'New Recovered', 'Active']]
stats_clean = stats_clean.replace(np.nan, 0, regex=True)

# calculate for global cases from previous day
prev_sum = prev_day.sum()
prev_sum['Country'] = 'World'
prev_sum = prev_sum[['Country', 'Confirmed', 'Deaths', 'Recovered']]
prev_sum = prev_sum.replace(np.nan, 0, regex=True)

# calculate for global cases for current day
sum_stats = stats_clean.sum()
sum_stats['Country'] = 'World'
sum_stats['New Cases'] = sum_stats['Confirmed'] - prev_sum['Confirmed']
sum_stats = sum_stats.replace(np.nan, 0, regex=True)
sum_stats = sum_stats[[
    'Country', 'Confirmed', 'New Cases', 'Deaths', 'New Deaths', 'Recovered', 'New Recovered', 'Active']]

我的第一次尝试:

class Corona:
    def __init__(self):
        pass

    def country_sum(self, country):
        country = stats_clean['Country'].isin([country])
        print(country)


Corona.country(US)

如果我将其设为静态方法,它会运行,但我没有使用 country_sum 中的参数。我想过滤任何通过的国家。 我不知道如何在方法中使用参数来过滤列中的值。

原始 csv 文件中的示例行:

FIPS,Admin2,Province_State,Country_Region,Last_Update,Lat,Long_,Confirmed,Deaths,Recovered,Active,Combined_Key
45001,Abbeville,South Carolina,US,2020-03-29 23:08:25,34.22333378,-82.46170658,3,0,0,0,"Abbeville, South Carolina, US"
22001,Acadia,Louisiana,US,2020-03-29 23:08:25,30.295064899999996,-92.41419698,9,1,0,0,"Acadia, Louisiana, US"
51001,Accomack,Virginia,US,2020-03-29 23:08:25,37.76707161,-75.63234615,3,0,0,0,"Accomack, Virginia, US"
16001,Ada,Idaho,US,2020-03-29 23:08:25,43.4526575,-116.24155159999998,92,1,0,0,"Ada, Idaho, US"
19001,Adair,Iowa,US,2020-03-29 23:08:25,41.33075609,-94.47105874,1,0,0,0,"Adair, Iowa, US"

【问题讨论】:

  • 您能否共享两个示例数据文件中的几行。
  • 您能否更具体地说明问题是什么?
  • 我不知道如何在方法中使用参数来过滤列中的值。
  • 看起来country_sum() 是一个实例方法,但您不是从Corona 的实例调用它。根据您在此处分享的内容,我不认为强制 OOP 是最好的主意。
  • 最终我想比较多个地区的人均数据并计算差异。

标签: python pandas numpy oop


【解决方案1】:

如果我没记错的话,你不应该在类之外的其他地方执行所有计算,然后访问变量,例如stats_clean 定义在全局范围内。

你应该这样做:

class Corona:
    root_dir = "<path-to-your-data-dir>"
    def __init__(self, date):
        self.file = os.path.join(self.root_dir, str(date) + ".csv") # use glob or something if you want to process multiple files etc.
        self._calculate_stats()

    def _calculate_stats(self):
        <do all your reading dataset and calculations here> 
        <....>
        self.stats_clean = ...
        self.prev_sum = ...

    def country_sum(self, country = 'US'):
        return self.stats_clean['Country'].isin([country])

那么你可以简单地做:

corona = Corona('03-29-2020')
print(corona.country_sum(<your-country>))

这只是一种方法。

【讨论】:

  • 感谢def country_sum(self, **country = 'US'**): return self.stats_clean['Country'].isin([country])
  • 等一下,如果我已经在方法中定义了国家,那么我如何更改调用该方法的国家?
  • 您只是在方法中为国家/地区提供默认值,因此如果我只调用 corona.country_sum() 而没有参数,那么它将返回美国的结果。但是,如果我拨打另一个国家/地区的电话,例如corona.country_sum('UK'),那么将获得英国的结果。希望能澄清你的疑问。如果它解决了您的问题,请接受我的回答。谢谢:)
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 2015-03-13
  • 2019-07-06
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
相关资源
最近更新 更多