我有以下数据框(示例):
min max lat lon
16744 1000 1000 60.75 25.75
18738 875 950 64.00 13.75
2811 925 1000 41.00 20.00
12361 1000 1000 54.00 -1.25
19257 1000 1000 64.75 42.00
和数组pressure
:
pressure=['1000','975','950','925','900','875','850','825','800','775','750','700','650']
我想用压力水平值基于min
到max
范围的行扩展数据框。将基于pressure
数组成员进行添加。即如果min
,max
是1000
,1000
,则将添加具有值975
的新行,所有其他单元格都与原始记录相同。
我已经部分解决了这个问题,而不是通过熊猫解决了。现在,由于数据框很大,我遇到了性能问题。
这是我所做的:
mini=sample['min'].to_numpy()
maksi=sample['max'].to_numpy()
for i, ma in enumerate(maksi):
poc=np.where(pressure==ma)
kr=np.where(pressure==mini[i])
if poc[0][0]==0:
pk=0
else:
pk=-1
if kr[0][0]==len(pressure):
kk=0
else:
kk=2
pock=poc[0][0]+pk
kraj=kr[0][0]+kk
pk=0
kk=0
levels=pressure[pock:kraj]
print(levels)
并打印以上代码:
[1000 975]
[975 950 925 900 875 850]
[1000 975 950 925 900]
[1000 975]
[1000 975]
我需要做的是将上述数组集成到示例数据框的记录中。
所需的输出:
pre lat lon
16744 1000 60.75 25.75
16744 975 60.75 25.75
18738 975 64.00 13.75
18738 950 64.00 13.75
18738 900 64.00 13.75
18738 875 64.00 13.75
18738 850 64.00 13.75
2811 1000 41.00 20.00
2811 975 41.00 20.00
2811 950 41.00 20.00
2811 925 41.00 20.00
2811 900 41.00 20.00
12361 1000 54.00 -1.25
12361 975 54.00 -1.25
19257 1000 64.75 42.00
19257 975 64.75 42.00
我能以向量方式完成所有这些操作吗-仅熊猫吗?任何帮助表示赞赏。
答案 0 :(得分:2)
让我们交叉合并和过滤:
(df.assign(min=lambda x: x['min']-25,dummy=1)
.reset_index()
.merge(pd.DataFrame({'pre':pressure, 'dummy':1}).astype(int),
on='dummy')
.loc[lambda x: x['pre'].between(x['min'],x['max'])]
.set_index('index')
.reindex(['pre','lat','lon'], axis=1)
)
输出:
pre lat lon
index
16744 1000 60.75 25.75
16744 975 60.75 25.75
18738 950 64.00 13.75
18738 925 64.00 13.75
18738 900 64.00 13.75
18738 875 64.00 13.75
18738 850 64.00 13.75
2811 1000 41.00 20.00
2811 975 41.00 20.00
2811 950 41.00 20.00
2811 925 41.00 20.00
2811 900 41.00 20.00
12361 1000 54.00 -1.25
12361 975 54.00 -1.25
19257 1000 64.75 42.00
19257 975 64.75 42.00