【问题标题】:How to fill rest of the day with temperature_min and temperature_max of that day using pandas?如何使用 pandas 用当天的 temperature_min 和 temperature_max 填充一天的剩余时间?
【发布时间】:2018-08-30 23:12:15
【问题描述】:

我有一个包含 4 列的数据框:daytimetmintmax。 tmin 显示当天的 temperature_min,tmax 显示 temperature_max。 我想要的是能够用当天的 tmin 和 tmax 填充一天的所有 NaN 值。例如我想转换这个数据框:

   day time     tmin tmax 
0   01 00:00:00 NaN NaN
1   01 03:00:00 -6.8 NaN
2   01 06:00:00 NaN NaN
3   01 09:00:00 NaN NaN
4   01 12:00:00 NaN NaN
5   01 15:00:00 NaN 1.2
6   01 18:00:00 NaN NaN
7   01 21:00:00 NaN NaN
8   02 00:00:00 NaN NaN
9   02 03:00:00 -7.2 NaN
10  02 06:00:00 NaN NaN
11  02 09:00:00 NaN NaN
12  02 12:00:00 NaN NaN
13  02 15:00:00 NaN 1.8
14  02 18:00:00 NaN NaN
15  02 21:00:00 NaN NaN

到这个数据框:

       day time     tmin tmax
    0   01 00:00:00 -6.8 1.2
    1   01 03:00:00 -6.8 1.2
    2   01 06:00:00 -6.8 1.2
    3   01 09:00:00 -6.8 1.2
    4   01 12:00:00 -6.8 1.2
    5   01 15:00:00 -6.8 1.2
    6   01 18:00:00 -6.8 1.2
    7   01 21:00:00 -6.8 1.2
    8   02 00:00:00 -7.2 1.8
    9   02 03:00:00 -7.2 1.8
    10  02 06:00:00 -7.2 1.8
    11  02 09:00:00 -7.2 1.8
    12  02 12:00:00 -7.2 1.8
    13  02 15:00:00 -7.2 1.8
    14  02 18:00:00 -7.2 1.8
    15  02 21:00:00 -7.2 1.8

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用groupbytransform

    df.assign(**df.groupby('day')[['tmin', 'tmax']].transform('first'))
    

        day      time  tmin  tmax
    0     1  00:00:00  -6.8   1.2
    1     1  03:00:00  -6.8   1.2
    2     1  06:00:00  -6.8   1.2
    3     1  09:00:00  -6.8   1.2
    4     1  12:00:00  -6.8   1.2
    5     1  15:00:00  -6.8   1.2
    6     1  18:00:00  -6.8   1.2
    7     1  21:00:00  -6.8   1.2
    8     2  00:00:00  -7.2   1.8
    9     2  03:00:00  -7.2   1.8
    10    2  06:00:00  -7.2   1.8
    11    2  09:00:00  -7.2   1.8
    12    2  12:00:00  -7.2   1.8
    13    2  15:00:00  -7.2   1.8
    14    2  18:00:00  -7.2   1.8
    15    2  21:00:00  -7.2   1.8
    

    或者,如果您想修改原始 DataFrame 而不是返回副本:

    df[['tmin', 'tmax']] = df.groupby('day')[['tmin', 'tmax']].transform('first')
    

    【讨论】:

    • 感谢 user3483203 的回答。这正是我想要的。
    • 乐于助人,快乐编程!
    • @user3483203 我能知道transform('first')在这里做什么吗?
    • transform可以进行很多操作。 transform 获取first() 的结果,并将其传播到组中的每一行。如果你只是做了df.groupby('day').first(),你将只有 2 行。如果您混淆了df.groupby('day').mean()df.groupby('day').transform('mean') 之间的区别(或几乎任何操作),您就会开始明白我的意思
    【解决方案2】:

    如果您不想像@user3483203 那样整洁地完成它!

    import pandas as pd
    myfile = pd.read_csv('temperature.txt', sep=' ')
    mydata = pd.DataFrame(data = myfile)
    
    for i in mydata['day']:
        row_start = (i-1) * 8 # assuming 8 data points per day
        row_end = (i) * 8
        mydata['tmin'][row_start:row_end] = pd.DataFrame.min(tempdata['tmin'][row_start:row_end], skipna=True)
        mydata['tmax'][row_start:row_end] = pd.DataFrame.max(tempdata['tmax'][row_start:row_end], skipna=True)
    

    【讨论】:

    • 谢谢。这非常有帮助,而且 99% 整洁。
    【解决方案3】:

    由于您没有发布任何代码,这里有一个通用的解决方案:

        Step 1: Create variables that will keep track of the min and max temps
        Step 2: Loop through each row in the frame
        Step 3: For each row, check if the min or max == "NaN"
        Step 4: If it is, replace with the value of the min or max variable we created earlier
    

    【讨论】:

    • 感谢您的解决方案。那么我怎样才能让它对天数敏感呢?我的意思是解决方案的第 1 步应该考虑天数,对吧?我不太了解这部分您的解决方案。
    • 例如 ... 创建名为“tmin”的变量并设置为 0 > 循环遍历给定日期的所有值 > 如果给定日期的温度不是 NaN 且低于 0,则将 tmin 设置为> 当您到达给定一天结束时,tmin 将包含最低温度
    • 在使用pandas时建议迭代很少是一个好方法
    【解决方案4】:

    只需将fillna 与前向填充和后向填充参数一起使用:

    df.tmin = df.groupby('day')['tmin'].fillna(method='ffill').fillna(method='bfill')
    df.tmax = df.groupby('day')['tmax'].fillna(method='ffill').fillna(method='bfill')
    

    【讨论】:

    • 我试过了,但我想将第 1 天的 tmintmax 值准确地放入当天的 NaN 值1 以及第 2 天的 tmintmax 到第 2 天的 NaN 值。您的答案用 tmax 填补了空白和 tmin 并且不考虑日期值。我说的对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多