【问题标题】:How to reverse the column value based on multiple conditions in pandas dataframe?如何根据熊猫数据框中的多个条件反转列值?
【发布时间】:2021-05-04 12:13:07
【问题描述】:

我想根据多个条件反转特定列的值。我有一个包含 (date, DeviceID, Value) 列的时间序列数据集。

输入数据:

|      date        || DeviceID  |   | Value |
| ---------------- || --------- |   | ----- |
| 28-12-2018 00:00 ||     d1    |   | 0.014 |
| 28-12-2018 00:15 ||     d1    |   | 0.013 |
| 28-12-2018 00:30 ||     d1    |   | 0.012 |
| 28-12-2018 00:45 ||     d1    |   | 0.011 |
|     :        :   ||     d1    |   |   :   |
| 28-12-2018 23:15 ||     d1    |   | 0.012 |
| 28-12-2018 23:30 ||     d1    |   | 0.017 |
| 28-12-2018 23:45 ||     d1    |   | 0.018 |
| 29-12-2018 00:00 ||     d2    |   | 0.019 |
| 29-12-2018 00:15 ||     d2    |   | 0.020 |
|      ....        ||     d2    |   |  ...  |
|        .         ||     .     |   |   .   |
|        .         ||     .     |   |   .   |
| 31-01-2019 23:45 ||     d2    |   |   .   |

预期输出:

|      date        || DeviceID  |   | Value |
| ---------------- || --------- |   | ----- |
| 28-12-2018 00:00 ||     d1    |   | 0.018 |
| 28-12-2018 00:15 ||     d1    |   | 0.017 |
| 28-12-2018 00:30 ||     d1    |   | 0.012 |
| 28-12-2018 00:45 ||     d1    |   | 0.010 |
|     :        :   ||     d1    |   |   :   |
| 28-12-2018 23:15 ||     d1    |   | 0.012 |
| 28-12-2018 23:30 ||     d1    |   | 0.013 |
| 28-12-2018 23:45 ||     d1    |   | 0.014 |
| 29-12-2018 00:00 ||     d2    |   | 0.019 |
| 29-12-2018 00:15 ||     d2    |   | 0.020 |
|      ....        ||     d2    |   |  ...  |
|        .         ||     .     |   |   .   |
|        .         ||     .     |   |   .   |
| 31-01-2019 23:45 ||     d2    |   |   .   |

我已尝试使用以下代码,但主数据框未更新。下面的代码正在反转这些值。另外,我尝试使用inplace=True,但出现错误。

df[df['DeviceID'].str.contains('d1') & df['date'].str.contains('28-12-2018')].Value.iloc[::-1]

我想为 d1 提供一组不同的设备(例如 d1、d3、d5、d9)及其相应的日期(例如 [28-12-2018, 30-12-2018],[03-01-2019] , 05-01-2019, 09-01-2018] 对于 d2 等等)。给定设备的反转值及其对应日期应反映在主数据框中。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我能想到的一种方法是重新索引,但在这种情况下,您需要数据框中所有索引的列表,所以这应该可行:

    # get the list of indices to reverse
    indices_rev=df[df['DeviceID'].str.contains('d1') & df['date'].str.contains('28-12-2018')].iloc[::-1].index
            
    # get list of indices to not reverse
    indices_keep=df[~df['DeviceID'].str.contains('d1') | ~df['date'].str.contains('28-12-2018')].index
            
    # add the lists
    indices=indices_rev.append(indices_keep)
            
    # reindex with the new list of indices
    df=df.reindex(indices)
    df
    

    【讨论】:

    • 它的工作。答案只有一个变化。 indices=indices_rev.append(indexes_keep) => indices=indices_rev.append(indices_keep)
    猜你喜欢
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 2023-02-21
    • 2019-08-29
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多