使用大熊猫对行进行分组

时间:2020-05-30 15:48:30

标签: python pandas loops indexing subset

我有两组数据帧:datamax,datamax2015和datamin,datamin2015。

数据段:

print(datamax.head())
print(datamin.head())
print(datamax2015.head())
print(datamin2015.head())

Date           ID Element  Data_Value
0  2005-01-01  USW00094889    TMAX         156
1  2005-01-02  USW00094889    TMAX         139
2  2005-01-03  USW00094889    TMAX         133
3  2005-01-04  USW00094889    TMAX          39
4  2005-01-05  USW00094889    TMAX          33
         Date           ID Element  Data_Value
0  2005-01-01  USC00200032    TMIN         -56
1  2005-01-02  USC00200032    TMIN         -56
2  2005-01-03  USC00200032    TMIN           0
3  2005-01-04  USC00200032    TMIN         -39
4  2005-01-05  USC00200032    TMIN         -94
         Date           ID Element  Data_Value
0  2015-01-01  USW00094889    TMAX          11
1  2015-01-02  USW00094889    TMAX          39
2  2015-01-03  USW00014853    TMAX          39
3  2015-01-04  USW00094889    TMAX          44
4  2015-01-05  USW00094889    TMAX          28
         Date           ID Element  Data_Value
0  2015-01-01  USC00200032    TMIN        -133
1  2015-01-02  USC00200032    TMIN        -122
2  2015-01-03  USC00200032    TMIN         -67
3  2015-01-04  USC00200032    TMIN         -88
4  2015-01-05  USC00200032    TMIN        -155

对于datamax,datamax2015,我想比较它们的Data_Value列,并在datamax2015中创建条目的数据框,其Data_Value大于一年中同一天的datamax中的所有条目。因此,预期的输出应该是一个数据帧,其中的行从 2015-01-01到2015-12-31 ,但是只有Data_Value列中的值大于日期中的值时才具有日期。 datamax数据帧的Data_Value列。

根据上面的条件,即4行和1到364列中的任何内容。

我想要datamin和datamin2015数据帧的最小(min)。

我尝试了以下代码:

upper = []
for row in datamax.iterrows():
    for j in datamax2015["Data_Value"]:
        if j > row["Data_Value"]:
            upper.append(row)
lower = []
for row in datamin.iterrows():
    for j in datamin2015["Data_Value"]:
        if j < row["Data_Value"]:
            lower.append(row)

有人可以帮我解决我的问题吗?

2 个答案:

答案 0 :(得分:2)

此代码完成了数据分钟所需的操作。还要尝试使其适应于datamax对称情况-如果您有困难并乐于提供进一步帮助,请发表评论。

创建数据

from datetime import datetime
import pandas as pd

datamin = pd.DataFrame({"date": pd.date_range(start=datetime(2005, 1, 1), end=datetime(2015, 12, 31)), "Data_Value": 1})
datamin["day_of_year"] = datamin["date"].dt.dayofyear
# Set the value for the 4th day of the year higher in order for the desired result to be non-empty
datamin.loc[datamin["day_of_year"]==4, "Data_Value"] = 2 

datamin2015 = pd.DataFrame({"date": pd.date_range(start=datetime(2015, 1, 1), end=datetime(2015, 12, 31)), "Data_Value": 2})
datamin2015["day_of_year"] = datamin["date"].dt.dayofyear
# Set the value for the 4th day of the year lower in order for the desired result to be non-empty
datamin2015.loc[3, "Data_Value"] = 1

解决方案

df1 = datamin.groupby("day_of_year").agg({"Data_Value": "min"})
df2 = datamin2015.join(df1, on="day_of_year", how="left", lsuffix="2015")
lower = df2.loc[df2["Data_Value2015"]<df2["Data_Value"]]
lower

我们将数据分钟按一年中的某天分组,以查找一年中每一天的所有年份中的分钟(使用.dt.dayofyear)。然后,将其与datamin2015结合起来,最后可以将Data_Value2015与Data_Value进行比较,以找到2015年Data_Value小于datamin中一年中所有同一天的最小值的行的索引。

在上面的示例中,按照我设置数据帧的方式,下排有1行。

答案 1 :(得分:0)

  1. Python代码,该代码将按年份返回2005-2014年期间最高气温和最低气温的折线图。每天最高气温和最低气温之间的区域应加阴影。
  2. 在2015年的数据上分散散布十年记录(2005-2014)创纪录的高点或纪录低点的任何点(高点和低点)在2015年被打破。
  3. 删除leap年日期(即2月29日)。

    from datetime import datetime
    import pandas as pd
    import matplotlib.pyplot as plt
    
    pd.set_option("display.max_rows",None,"display.max_columns",None)
    data = pd.read_csv('data/C2A2_data/BinnedCsvs_d400/fb441e62df2d58994928907a91895ec62c2c42e6cd075c2700843b89.csv') 
    newdata = data[(data['Date'] >= '2005-01-01') & (data['Date'] <= '2014-12-12')]
    datamax = newdata[newdata['Element']=='TMAX']
    datamin = newdata[newdata['Element']=='TMIN']
    datamax['Date'] = pd.to_datetime(datamax['Date'])
    datamin['Date'] = pd.to_datetime(datamin['Date'])
    datamax["day_of_year"] = datamax["Date"].dt.dayofyear
    datamax = datamax.groupby('day_of_year').max()
    datamin["day_of_year"] = datamin["Date"].dt.dayofyear
    datamin = datamin.groupby('day_of_year').min()
    datamax = datamax.reset_index()
    datamin = datamin.reset_index()
    datamin['Date'] = datamin['Date'].dt.strftime('%Y-%m-%d')
    datamax['Date'] = datamax['Date'].dt.strftime('%Y-%m-%d')
    datamax = datamax[~datamax['Date'].str.contains("02-29")]
    datamin = datamin[~datamin['Date'].str.contains("02-29")]
    
    breakoutdata = data[(data['Date']  > '2014-12-31')]
    datamax2015 = breakoutdata[breakoutdata['Element']=='TMAX']
    datamin2015 = breakoutdata[breakoutdata['Element']=='TMIN']
    datamax2015['Date'] = pd.to_datetime(datamax2015['Date'])
    datamin2015['Date'] = pd.to_datetime(datamin2015['Date'])
    datamax2015["day_of_year"] = datamax2015["Date"].dt.dayofyear
    datamax2015 = datamax2015.groupby('day_of_year').max()
    datamin2015["day_of_year"] = datamin2015["Date"].dt.dayofyear
    datamin2015 = datamin2015.groupby('day_of_year').min()
    datamax2015 = datamax2015.reset_index()
    datamin2015 = datamin2015.reset_index()
    datamin2015['Date'] = datamin2015['Date'].dt.strftime('%Y-%m-%d')
    datamax2015['Date'] = datamax2015['Date'].dt.strftime('%Y-%m-%d')
    datamax2015 = datamax2015[~datamax2015['Date'].str.contains("02-29")]
    datamin2015 = datamin2015[~datamin2015['Date'].str.contains("02-29")]
    
    dataminappend = datamin2015.join(datamin,on="day_of_year",rsuffix="_new")
    lower = dataminappend.loc[dataminappend["Data_Value_new"]>dataminappend["Data_Value"]]
    datamaxappend = datamax2015.join(datamax,on="day_of_year",rsuffix="_new")
    upper = datamaxappend.loc[datamaxappend["Data_Value_new"]<datamaxappend["Data_Value"]]
    
    upper['Date'] = pd.to_datetime(upper['Date']) 
    lower['Date'] = pd.to_datetime(lower['Date']) 
    datamax['Date'] = pd.to_datetime(datamax['Date']) 
    datamin['Date'] = pd.to_datetime(datamin['Date']) 
    
    ax = plt.gca()
    plt.plot(datamax['day_of_year'],datamax['Data_Value'],color='red')
    plt.plot(datamin['day_of_year'],datamin['Data_Value'], color='blue')
    plt.scatter(upper['day_of_year'],upper['Data_Value'],color='purple')
    plt.scatter(lower['day_of_year'],lower['Data_Value'], color='cyan')
    
    plt.ylabel("Temperature (degrees C)",color='navy')
    plt.xlabel("Date",color='navy',labelpad=15)
    plt.title('Record high and low temperatures by day (2005-2014)', alpha=1.0,color='brown',y=1.08)
    ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.35),fancybox=False,labels=['Record high','Record low'])
    plt.xticks(rotation=30)
    plt.fill_between(range(len(datamax['Date'])), datamax['Data_Value'], datamin['Data_Value'],color='yellow',alpha=0.8)
    plt.show()
    
  4. 我已经使用Datamin ['Date'] = datamin ['Date']。dt.strftime('%Y-%m-%d')将“日期”列转换为字符串。 p>

  5. 然后我使用upper ['Date'] = pd.to_datetime(upper ['Date'])

    将其转换回“ datetime”格式

  6. 然后我将“日期”作为x值。