使用大熊猫替换行

问题描述 投票:0回答:1

我有两组数据帧: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列中的值大于Data_Value列中的值时才带有日期datamax数据帧的

即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)

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

python pandas loops indexing subset
1个回答
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进行比较,以查找其中data_Value在2015年中小于datamin中一年中所有同一天的最小值的行的索引。

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

© www.soinside.com 2019 - 2024. All rights reserved.