我有天气数据的数据框:
ID Date Element Data_Value
0 USW00094889 2014-11-12 TMAX 22
1 USC00208972 2009-04-29 TMIN 56
2 USC00200032 2008-05-26 TMAX 278
3 USC00205563 2005-11-11 TMAX 139
4 USC00200230 2014-02-27 TMAX -106
5 USW00014833 2010-10-01 TMAX 194
6 USC00207308 2010-06-29 TMIN 144
7 USC00203712 2005-10-04 TMAX 289
8 USW00004848 2007-12-14 TMIN -16
9 USC00200220 2011-04-21 TMAX 72
10 USC00205822 2013-01-16 TMAX 11
11 USC00205822 2008-05-29 TMIN 28
12 USC00203712 2008-10-17 TMIN 17
13 USC00205563 2006-05-14 TMAX 183
14 USC00200842 2006-05-14 TMAX 122
....
165083 USC00200230 2006-11-29 TMIN 117
我想制作两个清单 - 每天的最小和最大温度。
我尝试这样做的方法是列出所有日期:
dates = df['Date'].unique()
,然后循环遍历数据并将值附加到这些列表:
for i in dates:
minT.append(df[(df['Date']==i) & (df['Element'] == 'TMIN')]['Data_Value'].min())
maxT.append(df[(df['Date']==i) & (df['Element'] == 'TMAX')]['Data_Value'].max())
我还尝试按日期AND data_values对数据框进行排序,然后选择列表中的第一个作为max,最后作为min:
df = df.sort_values(['Date','Data_Value'], ascending=False)
for i in dates:
minT.append(df[df['Date']==dates[0]]['Data_Value'].values[-1])
maxT.append(df[df['Date']==dates[0]]['Data_Value'].values[0])
但是一切仍然需要很长时间:( ...有人可以帮助我加快速度吗?
答案 0 :(得分:1)
您可能想尝试pandas.DataFrame.groupby
方法:
# GENERATE SOME TEST DATA
data = \
u"""
ID,Date,Element,Data_Value
USW00094889,2014-11-12,TMAX,22
USC00208972,2014-11-12,TMIN,56
USC00200032,2008-05-26,TMAX,278
USC00205563,2005-11-11,TMAX,139
USC00200230,2014-02-27,TMAX,-106
USW00014833,2010-10-01,TMAX,194
USC00207308,2010-06-29,TMIN,144
USC00203712,2012-06-29,TMAX,289
USW00004848,2007-12-14,TMIN,-16
USC00200220,2011-04-21,TMAX,72
USC00205822,2013-01-16,TMAX,11
USC00205822,2008-05-29,TMIN,28
USC00203712,2006-05-14,TMIN,17
USC00205563,2006-05-14,TMAX,183
USC00200842,2006-05-14,TMAX,122
"""
buffer = io.StringIO(data)
df = pandas.DataFrame.from_csv(buffer).reset_index(0)
# Here is your magic sauce for iteration
grouper = df.groupby('Date')
df_min_max = pandas.DataFrame(columns=['min', 'max'])
# You can now use the grouper for iteration
for date, data in grouper:
df_min_max.loc[date, 'min'] = min(data['Data_Value'])
df_min_max.loc[date, 'max'] = max(data['Data_Value'])
注意:如果您愿意,可以将其他字段添加到输出DataFrame中。另请注意,DataFrame变得越大,追加到DataFrame就越昂贵。因此,您可能希望实际将max和min值附加到列表中,具体取决于您要分析的数据量。