繁体   English   中英

使用 Python Pandas 按条件合并连续行

[英]Consolidation of consecutive rows by condition with Python Pandas

我尝试处理下一个数据问题。 我有一个 dataframe 值及其标签列表(这是多类的,所以标签是一个列表)。

dataframe 看起来像:

     | value| labels
---------------------
row_1| A    |[label1]
row_2| B    |[label2]
row_3| C    |[label3, label4]
row_4| D    |[label4, label5]

我想找到所有具有特定 label 的行,然后:

  1. 首先,将其与下一行连接 - 字符串将在下一行的值之前连接。
  2. 其次,标签将附加到下一行的 label 列表中

例如,如果我想为label2执行此操作,则所需的 output 将是:

     | value| labels
---------------------
row_1| A    |[label1]
row_3| BC   |[label2, label3, label4]
row_4| D    |[label4, label5]

值“B”在下一行的值之前连接,并且 label“label2”将附加到下一行的 label 列表的开头。 这些索引与我无关。

我将不胜感激这方面的帮助。 我尝试使用、 mergejoinshiftcumsum ,但到目前为止没有成功。


以下代码在示例中创建数据:

data = {'row_1': ["A", ["label1"]], 'row_2': ["B", ["label2"]],
        'row_3':["C", ["label3", "label4"]], 'row_4': ["D", ["label4", "label5"]]}
df = pd.DataFrame.from_dict(data, orient='index').rename(columns={0: "value", 1: "labels"})

您可以创建一个分组变量并使用它来聚合列

import pandas as pd
import numpy as np

def my_combine(data, value):
    index = data['labels'].apply(lambda x: np.isin(value, x))
    if(all(~index)):
        return data
    idx = (index | index.shift()).to_numpy()
    vals = (np.arange(idx.size) + 1) *(~idx)
    gr = np.r_[np.where(vals[1:] != vals[:-1])[0], vals.size - 1]
    groups = np.repeat(gr, np.diff(np.r_[-1, gr]) )
    return data.groupby(groups).agg(sum)
my_combine(df, 'label2')

  value                    labels
0     A                  [label1]
2    BC  [label2, label3, label4]
3     D          [label4, label5]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM