首页 > 解决方案 > Pandas:合并 DataFrame 并插入特定位置,同时保留初始顺序

问题描述

如果我有一个输入数据框df

   PtNo  Elev data
0     1   6.0    a
1     2   4.4    b
2     3   2.5    c
3     4   5.1    d
4     5   7.0    e

和一个属性数据框props

   Elev props
0   2.5    ab
1   2.8    ba
2   3.3    cc
3   4.0    dd
4   4.4    ee
5   5.1    hh
6   6.0    nn
7   6.2    pp
8   7.0    ii

关于数据,您可以将其df视为横截面,其中横截面的中点位于最小高程处。 props是关于由高程指定的横截面的属性表。

现在,我需要执行 2 个操作:

  1. 将数据从我有匹配的地方props合并dfElev
  2. 按照介于 之间的位置 props的顺序插入行。这似乎是一对多类型的插入,您需要在最小标高的两侧插入。dfprops.Elevdf.Elev

我解决这个问题的方法感觉很老套,我想知道是否有更简洁的方法来完成这个插入/合并操作。从概念上讲,这是工作流程:

  1. 分用df_ left_rightdf.Elev.idxmin()
  2. 使用for和props_searchsortedleftright
  3. 重新索引leftright使用在步骤 2 中找到的正确顺序(即_left_right
  4. 合并数据以获得结果。
df = pd.DataFrame(data = {'PtNo': [1,2,3,4,5],
                          'Elev':[6,4.4,2.5,5.1,7],
                          'data': ['a','b','c','d','e']})


props = pd.DataFrame(data = {'Elev':[2.5,2.8,3.3,4,4.4,5.1,6,6.2,7],
                             'props': ['ab','ba','cc','dd','ee','hh','nn', 'pp','ii']})

left = df.loc[:df.Elev.idxmin(), :]
left = left.sort_values('Elev')
right = df.loc[df.Elev.idxmin():, :]

_right = []
_left = []
for val in props.Elev:
    
    if val in left.Elev.values:
        _left.append(val)
    else:
        idx = left.Elev.searchsorted(val)
        _left.insert(idx,val)
    

    if val in right.Elev.values:
        _right.append(val)
    else:
        idx = right.Elev.searchsorted(val)
        _right.insert(idx,val)
        

left =  left.set_index('Elev').reindex(_left).sort_index()
left = left.loc[:left.PtNo.idxmin()]
left = left[::-1]
right =  right.set_index('Elev').reindex(_right).sort_index()

res = pd.concat([left,right.iloc[1:]])
res = res.merge(props, on=['Elev'], how='left')

我想要的结果res是:

    Elev  PtNo data props
0    6.0   1.0    a    nn
1    5.1   NaN  NaN    hh
2    4.4   2.0    b    ee
3    4.0   NaN  NaN    dd
4    3.3   NaN  NaN    cc
5    2.8   NaN  NaN    ba
6    2.5   3.0    c    ab
7    2.8   NaN  NaN    ba
8    3.3   NaN  NaN    cc
9    4.0   NaN  NaN    dd
10   4.4   NaN  NaN    ee
11   5.1   4.0    d    hh
12   6.0   NaN  NaN    nn
13   6.2   NaN  NaN    pp
14   7.0   5.0    e    ii

标签: pythonpandasdataframe

解决方案


推荐阅读