我有一个数据框:

   lft rel rgt num
0   t3  r3  z2  3
1   t1  r3  x1  9
2   x2  r3  t2  8
3   x4  r1  t2  4
4   t1  r1  z3  1
5   x1  r1  t2  2
6   x2  r2  t4  4
7   z3  r2  t4  5
8   t4  r3  x3  4
9   z1  r2  t3  4

和一本参考词典:

replacement_dict = {
    'X1' : ['x1', 'x2', 'x3', 'x4'],
    'Y1' : ['y1', 'y2'],
    'Z1' : ['z1', 'z2', 'z3']
}

我的目标是将所有出现的replacement_dict['X1']替换为‘X1’,然后将这些行合并在一起.例如,‘x1’、‘x2’、‘x3’或‘x4’的任何实例都将替换为‘x1’等.

我可以通过 Select 包含任何这些字符串的行并将它们替换为‘X1’来完成此操作:

keys = replacement_dict.keys()
for key in keys:
    DF.loc[DF['lft'].isin(replacement_dict[key]), 'lft'] = key
    DF.loc[DF['rgt'].isin(replacement_dict[key]), 'rgt'] = key

给予:

    lft rel rgt num
0   t3  r3  Z1  3
1   t1  r3  X1  9
2   X1  r3  t2  8
3   X1  r1  t2  4
4   t1  r1  Z1  1
5   X1  r1  t2  2
6   X1  r2  t4  4
7   Z1  r2  t4  5
8   t4  r3  X1  4
9   Z1  r2  t3  4

现在,如果我 Select 包含‘X1’的所有行并合并它们,结果应该是:

    lft rel rgt num
0   X1  r3  t2  8
1   X1  r1  t2  6
2   X1  r2  t4  4
3   t1  r3  X1  9
4   t4  r3  X1  4

因此,三列[‘lft’、‘rel’、‘rgt’]是唯一的,而‘num’列是为这些行中的每一行加起来的.上面的第1行:[‘X1’‘R1’‘T2’6]是两行[‘X1’‘R1’‘T2’4]和[‘X1’‘R1’‘T2’2]的总和.

对于少量的行,我可以很容易地做到这一点,但我使用的是一个有600万行的数据帧和一个有60,000个键的替换字典.使用简单的逐行提取和替换,这将耗费很长时间.

如何才能有效地调整这部分(特别是最后一部分)?有没有人可以推荐的Pandas 小把戏?

推荐答案

按LFT、REL和RGT列分组后,可以反转replacement_dict个映射并求和num个值.

# reverse replacement map
reverse_map = {v : k for k, li in replacement_dict.items() for v in li}
# change values in lft column using reverse_map
df['lft'] = df['lft'].map(reverse_map).fillna(df['lft'])
# change values in rgt column using reverse_map
df['rgt'] = df['rgt'].map(reverse_map).fillna(df['rgt'])
# sum values in num column by groups
df.groupby(['lft', 'rel', 'rgt'], as_index=False)['num'].sum()

Python相关问答推荐

在Python中使用readline函数时如何向下行

Pandas使用过滤器映射多列

Plotly:如何更改Heatmap中彩色条的勾选文本

阅读Polars Python中管道的函数定义

如何在Deliveryter笔记本中从同步上下文正确地安排和等待Delivercio代码中的结果?

提取两行之间的标题的常规表达

大Pandas 胚胎中产生组合

scikit-learn导入无法导入名称METRIC_MAPPING64'

如何获得每个组的时间戳差异?

Streamlit应用程序中的Plotly条形图中未正确显示Y轴刻度

Pandas计数符合某些条件的特定列的数量

driver. find_element无法通过class_name找到元素'""

用渐近模计算含符号的矩阵乘法

如何在达到end_time时自动将状态字段从1更改为0

numpy.unique如何消除重复列?

具有相同图例 colored颜色 和标签的堆叠子图

用SymPy在Python中求解指数函数

通过追加列表以极向聚合

如何在Python中使用Iscolc迭代器实现观察者模式?

如何将一组组合框重置回无 Select tkinter?