Date MAC SENS_1 SENS_2 SENS_3 SENS_4 SENS_N
0 2023-06-08 MAC1 79.608346 64.2030 66.181849 149.590573 12.135441
1 2023-06-09 MAC1 80.655564 64.6430 67.636943 109.034809 12.278676
2 2023-06-08 MAC2 5.323341 4.7814 57.231430 51.422297 0.494853
3 2023-06-09 MAC2 5.375561 4.7788 63.701169 88.638871 0.471265
4 2023-06-08 MAC3 3.221366 3.0242 61.071023 113.812544 0.251471
5 2023-06-09 MAC3 3.277577 3.0300 67.280632 133.127433 0.274765
6 2023-06-08 MAC4 3.029806 2.6720 63.310941 72.074345 0.393294
7 2023-06-09 MAC4 3.129871 2.6850 72.727142 100.133454 0.408941
8 2023-06-08 MAC5 18.987204 18.1676 57.660920 98.760819 1.219735
9 2023-06-09 MAC5 19.158136 18.1766 61.598102 93.546477 1.270471
10 2023-06-08 MACN 38.190817 35.2416 68.589171 160.597307 2.531353
11 2023-06-09 MACN 38.393878 34.3196 67.710298 139.854140 2.675000
对于这个数据框,我想知道每台机器有多少传感器,为最新日期创建高-低情况。
今天 (2023-06-09)SENS_1MAC1 的值大于昨天 (2023-06-08)的值。 SENS_2、SENS_3 和 SENS_N
也同样如此所以我需要返回的是一个机器列表(df),其中包含满足条件的传感器的名称和数量:
| MACHINE | SENSORS | N. of SENSORS |
|:---- |:------:| -----:|
| MAC1 | SENS_1,SENS_2,SENS_3,SENS_N | 4 |
| MAC2 | SENS_1,SENS_3,SENS_4 | 3 |
| MAC3 | SENS_1,SENS_2,SENS_3,SENS_4,SENS_N | 5 |
| MAC4 | SENS_1,SENS_2,SENS_3,SENS_4,SENS_N | 5 |
| MAC5 | SENS_1,SENS_2,SENS_3,SENS_N | 4 |
| MACN | SENS_1,SENS_N | 2 |
我可以使用:
high_lows = df.loc[(df['MAC1'] == df['MAC1'].shift(-1)) & (df['SENS_5'] < df['SENS_5'].shift(-1)) ,'MAC1']
一一识别具有高低点的传感器。 然而,几乎有500 台机器和 150 个传感器。
所以我认为我需要通过在 MAC 列之后选择 SENSORS 来迭代列:
df.iloc[:,2:]
并检查情况。
但是此函数将每 2000 毫秒(2 秒)运行一次,因此必须以尽可能最快的方式完成。
迭代 N 个组的 N 列并提取与条件匹配的组的最有效方法是什么?
带有 NaN 的示例数据:
Date MAC SENS_1 SENS_2 SENS_3 SENS_4 SENS_5
82 2023-06-08 MAC41 79.608346 NaN 66.181849 149.590573 12.135441
83 2023-06-09 MAC41 80.655564 NaN 67.636943 109.034809 12.278676
最佳答案
您可以使用:
def count(df):
m = df.iloc[:, 2:].diff().fillna(True).gt(0).all(axis=0)
return pd.Series({'Sensors': ', '.join(m.index[m]), 'Count': m.sum()})
out = df.groupby('MAC', as_index=False).apply(count)
输出:
>>> out
MAC Sensors Count
0 MAC1 SENS_1, SENS_2, SENS_3, SENS_N 4
1 MAC2 SENS_1, SENS_3, SENS_4 3
2 MAC3 SENS_1, SENS_2, SENS_3, SENS_4, SENS_N 5
3 MAC4 SENS_1, SENS_2, SENS_3, SENS_4, SENS_N 5
4 MAC5 SENS_1, SENS_2, SENS_3, SENS_N 4
5 MACN SENS_1, SENS_N 2
替代方案(因为每台机器只有今天和昨天的行):
def count(df):
m = df.iloc[1, 2:] - df.iloc[0, 2:] > 0
return pd.Series({'Sensors': ', '.join(m.index[m]), 'Count': m.sum()})
out = df.groupby('MAC', as_index=False).apply(count)
关于pandas - 检查连续日期之间满足相同条件的 N 列,并返回每组的列数和 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76450371/