我有一个数据框,其中包含三个系列,分别称为日期,元素, 和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
我只想要一个数据框,该数据框具有每个唯一的日期以及当天的最高温度。
答案 0 :(得分:2)
如果我对您的理解正确,那么您要按照Grzegorz在评论中已经建议的那样,进行groupby日期(取一个日期的所有元素),然后取该日期的最大值:< / p>
df.groupby('date').max()
这将占用您所有的组,并将它们减少到仅一行,并使用每个组的最大元素。在这种情况下,max()
被称为组的聚合函数。正如您所提到的,在某些时候还需要最小数量,一个很好的方法(而不是两个groupby)是执行以下操作:
df.groupby('date').agg(['max', 'min'])
,它将一次遍历所有组,并应用两个聚合函数max
和min
,为每个输入列返回两列。有关聚合的更多文档是here。
答案 1 :(得分:1)
尝试一下:
df.groupby("Date")['data_value'].max()