【问题标题】:Vectorize a manipulation of a portion of DataFrame向量化对部分 DataFrame 的操作
【发布时间】:2021-03-09 12:36:30
【问题描述】:

我有这个任务,我不想为我解决它,我只想使用最 PYTHONIC 的方式来解决它“那么在存在矢量化等技术的情况下,通过执行 100 个 for 循环进行编程的意义是什么” , 此外,我一直卡在某个点上,我不知道为什么它对我不起作用。

任务 我的数据集是国家环境信息中心的一个子集,它是来自数千个陆地站的每日气候记录。数据如下我应该清理数据并根据一年中 365 天的每一天绘制温度。

df
    ID          Date        Element Data_Value
0   USW00094889 2014-11-12  TMAX    2.2
1   USC00208972 2009-04-29  TMIN    5.6
2   USC00200032 2008-05-26  TMAX    27.8
3   USC00205563 2005-11-11  TMAX    13.9
4   USC00200230 2014-02-27  TMAX    -10.6
5   USW00014833 2010-10-01  TMAX    19.4
6   USC00207308 2010-06-29  TMIN    14.4
7   USC00203712 2005-10-04  TMAX    28.9
8   USW00004848 2007-12-14  TMIN    -1.6
9   USC00200220 2011-04-21  TMAX    7.2
df.shape
(165085, 4)

我的策略 1- 将 DF 分成两 (2) 个 DF,一个用于 Element='TMAX',另一个用于 Element='TMIN',因为当时我没有找到按“日期”和“元素”分组的方法使用一个矢量化命令将每个结果放在单独的列中。

2- 按“Data_Value”上的“日期”聚合,MAX 代表 DFMAX,MIN 代表 DFMIN。

3- 使用外部和索引合并两个 DF = True

4- 删除闰日

5- 添加“Day_of_Year”列,该列将保存一年中的日期。在这里我卡住了,因为闰年​​有 366 天,这意味着正常年份的 3 月 1 日的 Day_of_Year = 60,而闰年的同一天 3 月 1 日的 Day_of_Year = 61。 因此,最终的绘图将不正确,因为闰年​​有一天的换日。

我尝试应用 lambda 函数来更改此特定闰年的值,但它会引发错误。代码和错误如下。

df['2008']['Day_of_Year'] = df['2008']['Day_of_Year'].apply(lambda x: x for x in range(1, 366))

此时,df.index 是 dateobject,因此使用了 df['2008']。

错误

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-47-f60e8731fc55> in <module>()
      4 #            
      5 
----> 6 df['2008']['Day_of_Year'] = df['2008']['Day_of_Year'].apply(lambda x: x for x in range(1, 366))

/opt/conda/lib/python3.6/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
   2292             else:
   2293                 values = self.asobject
-> 2294                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   2295 
   2296         if len(mapped) and isinstance(mapped[0], Series):

pandas/src/inference.pyx in pandas.lib.map_infer (pandas/lib.c:66124)()

TypeError: 'generator' object is not callable

提前欣赏。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以将“日期”列转换为时间戳:

    df["Date"] = pd.to_datetime(df["Date"])
    

    然后你可以设置同一列作为索引:

    df = df.set_index("Date")
    

    最后绘制“Data_Value”:

    df['Data_Value"].plot()
    

    如果你想分别绘制 TMAX 和 TMIN,那么:

    df['Data_Value"][df["Element"] == "TMAX"].plot()
    df['Data_Value"][df["Element"] == "TMIN"].plot()
    

    【讨论】:

    • 这不是解决办法,数据集相当复杂
    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多