首页 > 解决方案 > 在分组数据中搜索信息并将其传播到组

问题描述

我有一个难题。

我的数据有一个 ID、一个分组键、一个标签和第二个标签。看起来有点像这样

|----|----------|-------|------|
|id  |group_col |label1 |label2|
|--- |----------|-------|------|
|1   | 1        | abcd  | 123  |
|2   | 1        | nfrv  | 123  |
|3   | 2        | dfgd  |      |
|4   | 3        | kgff  | 899  |
|5   | 3        | kgff  | 899  |
|6   | 3        | ygoi  |      |
|7   | 4        | tgfo  |      |
|8   | 4        | tgfo  |      |  
|----|----------|-------|------|

现在我的挑战是在每个组中检查两个人是否具有相同的 label2 值,如果是,则将其传播给该组的所有成员。并且另外为整个组(最好是第一个人)设置相同的 label1 值(如果人们有想法,也可以在新列中)。

预期的输出应该是这样的:

|----|----------|-------|------|------------|
|id  |group_col |label1 |label2| label1_new |
|--- |----------|-------|------|------------|
|1   | 1        | abcd  | 123  | abcd       |
|2   | 1        | abcd  | 123  | abcd       |
|3   | 2        | dfgd  |      | dfgd       |
|4   | 3        | kgff  | 899  | kgff       | 
|5   | 3        | kgff  | 899  | kgff       |  
|6   | 3        | ygoi  | 899  | kgff       |  
|7   | 4        | tgfo  |      | tgfo       |  
|8   | 4        | tgfo  |      | tgfo       |  
|----|----------|-------|------|------------|

另外请注意,这将必须在数百万行/组上运行,因此应该尽可能高效

谢谢你的帮助

标签: pythonpandas

解决方案


实际上,我之前有点脑电波,并想出了一个可能的解决方案。还没有在大型数据喷气机上测试过,也没有清理过(稍后会这样做)。但如果有人有更好的方法,我很想听听。

df = pd.DataFrame(np.array([[1,1,'abcd',123],
                  [2,1,'nfrv',123],
                  [3,2,'dfgd',''],
                  [4,3,'kgff',899],
                  [5,3,'kgff',899],
                  [6,3,'ygoi',''],
                  [7,4,'tgfo',''],
                  [8,4,'tgfo',''],
                  [9,5,'etre',588],
                    [10,5,'etre',743],
                            [11,5,'dsfe',743]
                           ]),
                  columns=['id','group_col','label1','label2']
                  )

def GroupComparison(df, ID,group_col, label1, label2 ):
    oppdatert=[]
    for group in df.group_col.drop_duplicates():
        g = df.loc[df.group_col == group]
        if g.label2.nunique()<g.id.count():
            npers = g.id.count()
            g = g.reset_index().drop('index', axis=1)
            var1 = g.iloc[[0]]['label1']
            var2 = g.iloc[[0]]['label2']
            g['label1']= var1
            g['label2']= var2
            g=g.fillna(method = 'ffill')
            oppdatert.append(g)
    opp = pd.concat(oppdatert)
    return opp

test = GroupComparison(df, 'id', 'group_col', 'label1', 'label2' )
test.head(11)

推荐阅读