熊猫-如何根据其他系列删除重复项?

时间:2020-02-07 18:38:16

标签: python pandas dataframe series

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

日期系列具有同一日期的多个重复项。例如。为了 日期为2005年1月1日,温度列有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

我只想要一个数据框,该数据框具有每个唯一的日期以及当天的最高温度。

2 个答案:

答案 0 :(得分:2)

如果我对您的理解正确,那么您要按照Grzegorz在评论中已经建议的那样,进行groupby日期(取一个日期的所有元素),然后取该日期的最大值:< / p>

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

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

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

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

答案 1 :(得分:1)

尝试一下:

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