从python

时间:2019-12-11 04:25:39

标签: python pandas dask

我试图根据第二个数据帧中某一列的某种情况,计算一个数据帧中一组元素的数量,并将其分配给另一数据帧中的另一列。

这是我需要更新的第一个数据框:

node   name       count
1   aaa-1-1
1   trg-3-4-5 
2   bbb-2-2-4
3   ccc-3-3

这是我将用来计算值的数据框

node  name 
1   Empty-1-1-1  
1   Empty-1-1-2
1   Empty-1-1-3
2   gbn-2-3-5
3   Empty-3-3-9

我应该从df1中的名称进行过滤,并计算df1中具有相同ID且具有字符串'EMPTY'和df1的1-1部分的元素数,因此输出应类似于

id   name       count
1   aaa-1-1    3
1   trg-3-4-5  0
2   bbb-2-2-4  0
3   ccc-3-3    1

为此,我将两个数据帧都附加在一起,然后按id分组,并在每个组处循环以获取计数

        df = df1.append(df2, ignore_index=True, sort=True)
       for _, gdf in df.groupby('node'):
            cds = gdf[gdf.name.str.count('-') == 2] 
            count_map = {}
            for i, c in cds.iterrows(): 
                k = c.name.split('-', 1)[-1] + '-'
                count_map[i] = gdf[gdf.name.str.contains('EMPTY-' + k)].shape[0]
            for kk, vv incount_map.items():
                df.loc[kk, 'count'] = vv
        return df

此功能可以正常工作,并且可以为我提供正确的结果,但是需要花费很长时间。我试图合并两个数据框,然后根据另一个合并计数,但是合并没有给我期望的记录,有什么办法可以优化此功能

编辑:

拥有两个数据框并在它们之间进行搜索对于庞大的数据集来说确实非常昂贵,因此我使用了to数据框并在按“节点”分组的位置创建了daskdata框,现在我的搜索将变得更加容易,所以我现在拥有的是:

df_partioined一个:

     node    name1        name2              count
       1 .    aaa-1-1 .     nan
       1 .    trg-3-4-5     nan
       1 .    nan           Empty-1-1-3
       1 .    nan .         Empty-1-1-1
       1      nan           Empty-1-1-2

现在在列名1处,我将过滤出仅包含两个破折号的名称 因此对于这种情况将为1-1,然后计算具有此字符串的元素的数量

所以我的预期输出将是

     node    name1        name2              count
       1 .    aaa-1-1 .     nan                  3
       1 .    trg-3-4-5     nan                  0
       1 .    nan           Empty-1-1-3          nan
       1 .    nan .         Empty-1-1-1          nan
       1      nan           Empty-1-1-2          nan

我将1-1拆分为新列,但不确定下一步该怎么做:(

1 个答案:

答案 0 :(得分:0)

尝试一下:

 df['count'] = df['name'].apply(lambda x: df1['name'].str.contains(pd.Series(x).str.extract(r'(?:(\d-\d.*))$')[0][0]).sum())

输出

   node       name  count
0     1    aaa-1-1      3
1     1  trg-3-4-5      0
2     2  bbb-2-2-4      0
3     3    ccc-3-3      1