【问题标题】:Pandas - How to remove duplicates based on another series?Pandas - 如何删除基于另一个系列的重复项?
【发布时间】:2020-02-07 18:38:16
【问题描述】:

我有一个数据框,其中包含三个系列,称为日期、元素、 和 Data_Value——它们的类型是字符串、字符串和 numpy.int64 分别。 Date 的日期格式为 yyyy-mm-dd;元素有 表示 TMIN 或 TMAX 的字符串,它表示是否 Data_Value 是特定日期的最低或最高温度; 最后,Data_Value 系列仅代表实际温度。

日期系列有多个相同日期的重复项。例如。为了 日期 2005-01-01,温度列有 19 个条目, 值从 28 开始,一直到 156。我想创建一个 仅包含日期和最高温度的新数据框-我会 最终也想要一个 TMIN 值,但我想如果我能做到 一个我可以弄清楚另一个。我会发布一些伪代码 下面的解释显示了我到目前为止所做的尝试。

到目前为止,我已经提取了 csv 并将其分配给变量 df。 然后我按日期、元素和温度对值进行排序 (数据_值)。之后,我创建了一个名为 tmax 的变量来抓取 必要的日期(我只需要 2005-2014 年的数据) 'TMAX' 作为其元素值。我将 tmax 转换为一个新的 DataFrame,重置 它的索引从第一个删除无用的索引数据 数据框,并删除了“元素”列,因为它在 这点。现在我(最终)试图创建一个列表 TMAX 的温度,以便我可以用 pyplot 绘制它。但我不能 为我的一生弄清楚如何将数据框减少到 单个日期和该日期的最大值。如果我能得到那个 我可以轻松地将系列转换为列表并绘制它。


    def record_high_and_low_temperatures():
        #read in csv
        df = pd.read_csv('somedata.csv') 

        #sort values so they're in a nice order
        df.sort_values(by=['Date', 'Element', 'Data_Value'], inplace=True) 

        # grab all entries for TMAX in correct date range
        tmax = df[(df['Element'] == 'TMAX') & (df['Date'].between("2005-01-01", "2014-12-31"))]

        # cast to dataframe
        tmax = pd.DataFrame(tmax, columns=['Date', 'Data_Value'])

        # Remove index column from previous dataframe
        tmax.reset_index(drop=True, inplace=True)

        # this is where I'm stuck, how do I get the max value per unique date? 
        max_temp_by_date = tmax.loc[tmax['Data_Value'].idxmax()]

感谢任何和所有帮助,如果我需要澄清任何事情,请告诉我。

TL;DR: 好的... 输入数据框看起来像

date     | data_value
2005-01-01    28
2005-01-01    33
2005-01-01    33
2005-01-01    44
2005-01-01    56
2005-01-02    0
2005-01-02    12
2005-01-02    30
2005-01-02    28
2005-01-02    22

预期的 df 应如下所示:

date     | data_value
2005-01-01    79
2005-01-02    90
2005-01-03    88
2005-01-04    44
2005-01-05    63

我只想要一个数据框,其中包含每个唯一日期以及当天的最高温度。

【问题讨论】:

  • df.groupby("Date").max() 你的意思是?
  • 这听起来可能很奇怪,但我认为你放的太多了,这让人不知所措。我们希望看到一个简单的输入 df 和预期的输出 df。帮助更容易
  • @Kenan 我添加了 TL;DR 版本。让我知道这是否有助于澄清它。

标签: python pandas dataframe series


【解决方案1】:

如果我对您的理解正确,您想要做的是 Grzegorz 在 cmets 中已经建议,是 groupby 日期(取一个日期的所有元素),然后取该日期的最大值:

df.groupby('date').max()

这将占用您的所有组并将它们减少到仅一行,从而占用每个组的最大元素。在这种情况下,max() 被称为组的聚合函数。正如您所提到的,在某些时候您还需要最小值,一个很好的方法(而不是两个 groupbys)是执行以下操作:

df.groupby('date').agg(['max', 'min'])

它将遍历所有组一次并应用两个聚合函数maxmin,为每个输入列返回两列。更多关于聚合的文档是here

【讨论】:

  • 更棒的是,我喜欢它的圆滑!谢谢!
  • @Moose 使用pandas 集成的绘图功能,您甚至可以使用a.groupby('a').agg(['max', 'min']).plot() 来同时绘制两者。只需确保导入 pyplot (import matplotlib.pylot as plt),然后添加 plt.show()
【解决方案2】:

试试这个:

df.groupby("Date")['data_value'].max()

【讨论】:

    猜你喜欢
    • 2018-05-01
    • 2023-01-19
    • 2021-11-03
    • 2022-01-25
    • 2012-05-19
    • 2017-12-17
    • 1970-01-01
    • 2020-04-19
    相关资源
    最近更新 更多