【问题标题】:Python: Need to reindex dataframe row w.r.t. column values, per groupPython:需要重新索引数据框行 w.r.t.列值,每组
【发布时间】:2022-01-12 10:44:06
【问题描述】:

得到输入数据框df如下:

Flow        Side        Row
Banana      Front       Row 1
PP Banana   Front       Row 1
Peach       Front       Row 1
Red Grape   Right End   Row 1
Kp Mango    Back        Row 1
PP Kp Mango Back        Row 1
Tomato      Left End    Row 1
Cucum       Front       Row 2
PP Cucum    Front       Row 2
Bunch       Right End   Row 2
Capsicum    Back        Row 2
Romo        Left End    Row 2

场景: 如果df['Flow'].str.contains('PP') && df['Side']=='Front',则需要将该特定行作为最后一行移动到具有相同行值的“Back”侧。如流“PP Banana”和“PP Cucum”的示例。 注意 - 不应更改其他流顺序。此外,对于“Row”列中的每个 Row 值,“Side”列的顺序应始终为前、右端、后、左端

预期输出:

Flow        Side        Row
Banana      Front       Row 1
Peach       Front       Row 1
Red Grape   Right End   Row 1
Kp Mango    Back        Row 1
PP Kp Mango Back        Row 1
PP Banana   Back        Row 1
Tomato      Left End    Row 1
Cucum       Front       Row 2
Bunch       Right End   Row 2
Capsicum    Back        Row 2
PP Cucum    Back        Row 2
Romo        Left End    Row 2

任何帮助将不胜感激!

【问题讨论】:

    标签: python-3.x pandas dataframe indexing


    【解决方案1】:

    您可以使用掩码提取需要移动的行和尾随(“左端”)行,然后使用 concat 再次加入并按组重新排序。

    m1 = df['Flow'].str.contains('PP') & df['Side'].eq('Front')
    m2 = df['Side'].eq('Left End')
    
    mask = m1|m2
    
    out = (pd.concat([df[~mask], df[mask].replace({'Side': {'Front': 'Back'}})])
             .sort_values(by='Row')
          )
    

    或者,如果您不想在最后对组进行排序并独立处理它们,您可以使用自定义函数:

    def move(d):
        m1 = d['Flow'].str.contains('PP') & d['Side'].eq('Front')
        m2 = d['Side'].eq('Left End')
        mask = m1|m2
        return pd.concat([d[~mask], d[mask].replace({'Side': {'Front': 'Back'}})])
    
    out = df.groupby('Row', group_keys=False).apply(move)
    

    输出:

               Flow       Side    Row
    0        Banana      Front  Row 1
    2         Peach      Front  Row 1
    3     Red Grape  Right End  Row 1
    4      Kp Mango       Back  Row 1
    5   PP Kp Mango       Back  Row 1
    1     PP Banana       Back  Row 1
    6        Tomato   Left End  Row 1
    7         Cucum      Front  Row 2
    9         Bunch  Right End  Row 2
    10     Capsicum       Back  Row 2
    8      PP Cucum       Back  Row 2
    11         Romo   Left End  Row 2
    

    【讨论】:

    • 完美运行!谢谢
    猜你喜欢
    • 2020-11-13
    • 2018-11-17
    • 2021-04-11
    • 1970-01-01
    • 2015-09-08
    • 2021-10-16
    • 1970-01-01
    • 2021-04-10
    • 2020-04-16
    相关资源
    最近更新 更多