扩展Numpy数组范围的熊猫数据框

时间:2020-10-02 19:20:08

标签: python pandas

我有以下数据框(示例):

        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']

我想用压力水平值基于minmax范围的行扩展数据框。将基于pressure数组成员进行添加。即如果minmax10001000,则将添加具有值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

我能以向量方式完成所有这些操作吗-仅熊猫吗?任何帮助表示赞赏。

1 个答案:

答案 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