python - 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 个操作:
- 将数据从我有匹配的地方
props
合并df
Elev
- 按照介于 之间的位置
props
的顺序插入行。这似乎是一对多类型的插入,您需要在最小标高的两侧插入。df
props.Elev
df.Elev
我解决这个问题的方法感觉很老套,我想知道是否有更简洁的方法来完成这个插入/合并操作。从概念上讲,这是工作流程:
- 分用
df
_left
_right
df.Elev.idxmin()
- 使用for和
props
_searchsorted
left
right
- 重新索引
left
并right
使用在步骤 2 中找到的正确顺序(即_left
和_right
) - 合并数据以获得结果。
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
解决方案
推荐阅读
- r - 如何根据此特定条件指定折线图的颜色?
- python - 可以使用 Selenium Python 找到类名
- api-gateway - KrakenD API 网关中的多个 POST 后端
- azure-pipelines - 如何从 Azure devops 触发 AWS 设备场测试
- android - 浓缩咖啡检查方法运行需要很长时间才能完成
- selenium - 从硒中的奇怪标签获取文本
- import - 将所有系统设置(不是实际的应用程序、文件或文件夹)从一台 Win10 机器轻松移动到另一台机器
- python - 使用滑块小部件更新 Seaborn FacetGrid
- python - 带参数的 tkinter 按钮
- c# - 如果 WPF 文本框中的值超过 int 值,则更改它