pandas - 检查连续日期之间满足相同条件的 N 列,并返回每组的列数和 ID

标签 pandas dataframe group-by

          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_2SENS_3SENS_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/

相关文章:

r - 在数据框 R 中动态创建列并根据其他列条件进行填充

python - 使用 sort_index() 时的关键函数

r - dplyr-使用变量名在多个列上分组

sql - Group By 似乎在简单的 Postgres 查询中增加了过多的计算量

python - 如何汇总列包含特定字符串的行中的所有值?

python - Pandas:用 NaN 替换数据帧所有数值列中的异常值 (3 sigma)

python - 显示股价上涨和下跌概率的 Pandas 系列函数

Python- Pandas : AttributeError: 'numpy.ndarray' object has no attribute 'start'

python - 将嵌套字典转换为数据框

Mysql查询动态将行转换为列