【问题标题】:How to sequence repeated measurement values in data table?如何对数据表中的重复测量值进行排序?
【发布时间】:2018-09-22 12:43:23
【问题描述】:

我在生产线上有一个测量值,例如:

import pandas as pd
import random
random.seed(2)
df = pd.DataFrame()
df['col1_date'] = pd.date_range('2018-09-01', periods=40, freq='D')
df['col2_id'] = pd.DataFrame(list(['A', 'B', 'C', 'D'] *10))
df['MeasuredValues'] = np.random.choice(10, 40)
df

基本上这些项目,例如 ['A', 'B', 'C', 'D'] 会随着它在行中取得进展而针对某些参数进行测量。我正在尝试在表格中添加一列,为我 col2_id 中的每个项目提供一系列测量,例如:第一次测量时我得到1st measurement,然后第二次测量我获取2nd measurement 等等。我可以通过对col2_idcol1_date 进行排序,在 excel 中手动完成一个 100 行的小表格。显然,对于成千上万的大量行,它没有多大意义。然后我可以比较col2_id 中所有项目的不同测量值。我不知道如何在 Pandas 或 Python 中做到这一点。

谁能给我一些建议?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果您的日期已排序,您可以使用cumcount

    df['measurement_number'] = 'measurement '+(df.groupby('col2_id').cumcount()+1).astype(str)
    

    或者:

    df['measurement_number'] = (df.groupby('col2_id').cumcount()+1).map(lambda x: f'measurement {x}')
    

    两者都给你:

    >>> df
        col1_date col2_id  MeasuredValues measurement_number
    0  2018-09-01       A               8      measurement 1
    1  2018-09-02       B               8      measurement 1
    2  2018-09-03       C               6      measurement 1
    3  2018-09-04       D               2      measurement 1
    4  2018-09-05       A               8      measurement 2
    5  2018-09-06       B               7      measurement 2
    6  2018-09-07       C               2      measurement 2
    7  2018-09-08       D               1      measurement 2
    8  2018-09-09       A               5      measurement 3
    9  2018-09-10       B               4      measurement 3
    10 2018-09-11       C               4      measurement 3
    11 2018-09-12       D               5      measurement 3
    12 2018-09-13       A               7      measurement 4
    13 2018-09-14       B               3      measurement 4
    14 2018-09-15       C               6      measurement 4
    15 2018-09-16       D               4      measurement 4
    16 2018-09-17       A               3      measurement 5
    17 2018-09-18       B               7      measurement 5
    18 2018-09-19       C               6      measurement 5
    19 2018-09-20       D               1      measurement 5
    20 2018-09-21       A               3      measurement 6
    21 2018-09-22       B               5      measurement 6
    22 2018-09-23       C               8      measurement 6
    23 2018-09-24       D               4      measurement 6
    24 2018-09-25       A               6      measurement 7
    25 2018-09-26       B               3      measurement 7
    26 2018-09-27       C               9      measurement 7
    27 2018-09-28       D               2      measurement 7
    28 2018-09-29       A               0      measurement 8
    29 2018-09-30       B               4      measurement 8
    30 2018-10-01       C               2      measurement 8
    31 2018-10-02       D               4      measurement 8
    32 2018-10-03       A               1      measurement 9
    33 2018-10-04       B               7      measurement 9
    34 2018-10-05       C               8      measurement 9
    35 2018-10-06       D               2      measurement 9
    36 2018-10-07       A               9     measurement 10
    37 2018-10-08       B               8     measurement 10
    38 2018-10-09       C               7     measurement 10
    39 2018-10-10       D               1     measurement 10
    

    如果您的日期未排序,请先对其进行排序。执行与上述相同的操作,但使用:

    df.sort_values('col1_date')
    

    首先。

    【讨论】:

    • 非常感谢您的快速回复!非常有帮助。我不知道cumcount
    【解决方案2】:

    groupbyrank

    df.assign(
        meas_num=
        df.groupby('col2_id').col1_date.rank().apply('{:.0f}'.format).radd('meas ')
    )
    

        col1_date col2_id  MeasuredValues meas_num
    0  2018-09-01       A               1   meas 1
    1  2018-09-02       B               3   meas 1
    2  2018-09-03       C               9   meas 1
    3  2018-09-04       D               7   meas 1
    4  2018-09-05       A               3   meas 2
    5  2018-09-06       B               5   meas 2
    6  2018-09-07       C               5   meas 2
    7  2018-09-08       D               2   meas 2
    8  2018-09-09       A               4   meas 3
    9  2018-09-10       B               0   meas 3
    10 2018-09-11       C               2   meas 3
    11 2018-09-12       D               0   meas 3
    12 2018-09-13       A               8   meas 4
    13 2018-09-14       B               5   meas 4
    14 2018-09-15       C               2   meas 4
    15 2018-09-16       D               0   meas 4
    16 2018-09-17       A               7   meas 5
    17 2018-09-18       B               1   meas 5
    18 2018-09-19       C               3   meas 5
    19 2018-09-20       D               7   meas 5
    20 2018-09-21       A               9   meas 6
    21 2018-09-22       B               5   meas 6
    22 2018-09-23       C               7   meas 6
    23 2018-09-24       D               7   meas 6
    24 2018-09-25       A               9   meas 7
    25 2018-09-26       B               3   meas 7
    26 2018-09-27       C               2   meas 7
    27 2018-09-28       D               9   meas 7
    28 2018-09-29       A               1   meas 8
    29 2018-09-30       B               8   meas 8
    30 2018-10-01       C               3   meas 8
    31 2018-10-02       D               8   meas 8
    32 2018-10-03       A               6   meas 9
    33 2018-10-04       B               4   meas 9
    34 2018-10-05       C               1   meas 9
    35 2018-10-06       D               2   meas 9
    36 2018-10-07       A               5  meas 10
    37 2018-10-08       B               9  meas 10
    38 2018-10-09       C               9  meas 10
    39 2018-10-10       D               1  meas 10
    

    【讨论】:

    • 非常感谢您的快速回复!非常有帮助。现在我很容易理解groupbyrank
    猜你喜欢
    • 2016-12-27
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2016-07-16
    • 2016-11-18
    • 1970-01-01
    相关资源
    最近更新 更多