-1

我有这个df:

            Timestamp        List     Power    Energy     Status
0 2020-01-01 01:05:50   [5, 5, 5]      7000     15000     online
1 2020-01-01 01:06:20   [6, 6, 6]      7500     16000     online
2 2020-01-01 01:08:30   [0, 0, 0]         5         0    offline
...

不,我想重新采样。使用 .resample 如下:

df2 = df.set_index('timestamp').resample('min').?

我想要 1 分钟内的 df - 间隔。对于每个间隔,我想与如下行匹配:列表:如果状态=在线:间隔的最后一个条目,否则为“0”;Power: if status = online: 区间的平均值 else '0'; 能量:如果状态=在线:间隔的最后一个条目否则'0; 状态:区间的最后状态;

如果df中没有数据,我如何填充.resample输出的NaN值?例如一个区间没有数据,那么df应该如下填充Power = 0; 能量 = 0;状态 = 离线;...

我尝试过这样的事情:

df2 = df.set_index('Timestamp').resample('T').agg({'List':'last',
                                                   'Power':'mean',
                                                   'Energy':'last',
                                                   'Status':'last'})

并得到:

         Timestamp        List                      Power    Energy     Status
0 2020-01-01 01:05   [5, 5, 5]  (average of the interval)     15000     online
1 2020-01-01 01:06   [6, 6, 6]  (average of the interval)     16000     online
2 2020-01-01 01:07         NaN                        NaN       NaN        NaN
3 2020-01-01 01:08   [0, 0, 0]                          5         0    offline

预期结果:

         Timestamp        List                      Power    Energy     Status
0 2020-01-01 01:05   [5, 5, 5]  (average of the interval)     15000     online
1 2020-01-01 01:06   [6, 6, 6]  (average of the interval)     16000     online
2 2020-01-01 01:07   [0, 0, 0]                          0         0    offline
3 2020-01-01 01:08   [0, 0, 0]                          5         0    offline
4

1 回答 1

1

如文档https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas中所示,无法通过 fillna 规则在.resample().agg()期间单独处理每列NA值。 DataFrame.agg.html

在您的情况下,即使插值也不起作用,因此,请尝试手动处理每列NA

首先,让我们初始化您的示例框架。

import pandas as pd

data = {"Timestamp":{"0": "2020-01-01 01:05:50",
                     "1": "2020-01-01 01:06:20",
                     "2": "2020-01-01 01:08:30"},
        "List": {"0": [5, 5, 5],
                 "1": [6, 6, 6],
                 "2": [0, 0, 0]},
        "Power": {"0": 7000,
                 "1": 7500,
                 "2": 5},
        "Energy": {"0": 15000,
                   "1": 16000,
                   "2": 0},
        "Status": {"0": "online",
                   "1": "online",
                   "2": "offline"},
       }

df = pd.DataFrame(data)

df['Timestamp'] = pd.to_datetime(df['Timestamp'])

df = df.set_index('Timestamp').resample('T').agg({'List':'last',
                                                   'Power':'mean',
                                                   'Energy':'last',
                                                   'Status':'last'})

现在我们可以分别手动替换每一列中的NA

df["List"] = df["List"].fillna("[0, 0, 0]")
df["Status"] = df["Status"].fillna('offline')
df = df.fillna(0)

或更方便的 dict 方式来做到这一点

values = {
          'List': '[0, 0, 0]',
          'Status': 'offline', 
          'Power': 0, 
          'Energy': 0
}

df = df.fillna(value=values)
Timestamp   List    Power   Energy  Status
0   2020-01-01 01:05:00     [5, 5, 5]   7000.0  15000.0     online
1   2020-01-01 01:06:00     [6, 6, 6]   7500.0  16000.0     online
2   2020-01-01 01:07:00     [0, 0, 0]   0.0     0.0     offline
3   2020-01-01 01:08:00     [0, 0, 0]   5.0     0.0     offline
于 2020-08-08T18:06:56.817 回答