[英]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 的行,然后:
例如,如果我想为label2
执行此操作,则所需的 output 将是:
| value| labels
---------------------
row_1| A |[label1]
row_3| BC |[label2, label3, label4]
row_4| D |[label4, label5]
值“B”在下一行的值之前连接,并且 label“label2”将附加到下一行的 label 列表的开头。 这些索引与我无关。
我将不胜感激这方面的帮助。 我尝试使用、 merge
、 join
、 shift
和cumsum
,但到目前为止没有成功。
以下代码在示例中创建数据:
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.