使用python中另一个数据帧的特定模式计算每组数据帧中的元素数
我试图计算一个数据帧中一个组的元素数量,并根据第二个数据帧中一列的某些条件将其分配给另一个数据帧中的另一列 这是我需要更新的第一个数据帧:使用python中另一个数据帧的特定模式计算每组数据帧中的元素数,python,pandas,dask,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-
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
这个函数可以工作并得到正确的结果,但需要很长时间。我尝试合并两个数据帧,然后根据另一个数据帧计算一列,但是合并并没有给我预期的记录,是否有任何方法可以优化此函数
编辑:
拥有两个数据帧并在它们之间进行搜索对于大型数据集来说非常昂贵,因此我使用megred to data frames并创建了daskdata frame,其中我按“节点”分组,现在我的搜索将更容易,因此我现在拥有的是:
df_第a部分:
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拆分为新列,但不确定下一步该怎么做:(试试这个:
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
试试这个:
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
我已经尝试过了,但它不起作用,因为我有一个巨大的数据帧,所以我所做的是合并两个数据帧,并在每个组中应用函数,我的问题不是我是否必须从一列中计算破折号的数量,如果它==2(e.x:tr-1-2)我应该数一数另一列中的
Empty-1-2
,这样它就会是我从上一列中得到的“Empty”+模式。你能帮我一下吗?谢谢,我试过了,但它不起作用,因为我有一个巨大的数据框,所以我所做的是合并两个数据框,并在每个组中应用函数,我的问题不是我是否必须从一列中计算破折号的数量,如果它是==2(e.x:tr-1-2),我应该在另一列中计算Empty-1-2
的数量,这样它将是我从上一列中得到的“Empty”+模式。你能帮我吗?非常感谢