【问题标题】:Expanding pandas dataframe with range of numpy array扩展具有 numpy 数组范围的 pandas 数据框
【发布时间】:2020-10-03 10:37:33
【问题描述】:

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

        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 数组成员进行添加。 IE。如果minmax10001000,则将添加一个值为975 的新行,所有其他单元格与原始记录相同。 我已经部分解决了这个问题,而不是使用 pandas,现在,由于数据框很大,我遇到了性能问题。 这是我所做的:

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

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

【问题讨论】:

  • “如果 min,max 为 1000,1000,新行值为 975”背后的逻辑是什么
  • 只是好奇,为什么你的pressure 数组是字符串数组?
  • 我已经从更大的代码中摘录了工作摘录。
  • @it is Chris 如果两个值都是 1000,我需要将压力扩展到 975。此外,如果 min max 是 875 和 950,我需要将其扩展到压力数组的相邻成员。类似的逻辑适用于所有行。

标签: python pandas


【解决方案1】:

让我们交叉合并和过滤:

(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

【讨论】:

  • 这很棒。一个问题,它是否适用于最小值最大值的任何可能值? Min max 可以从压力数组中获取任何值。请注意,压力的最后三个成员以 50 间隔。
猜你喜欢
  • 2020-05-19
  • 2021-05-20
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 2020-06-28
相关资源
最近更新 更多