【问题标题】:python iteration over each bins in a dataframepython对数据框中的每个bin进行迭代
【发布时间】:2016-07-07 21:43:26
【问题描述】:

我正在处理测量数据集。我在下表中的数据框中有数据,数据是每 0.5m/s 风速箱的功率和风速。但是我需要根据功率和风速值计算每个箱的灵敏度列。灵敏度的公式是

sensitivity = abs ( (Pi - Pi_1) / (Vi - Vi_1) )

我们必须从之前的 bin 值中减去功率和速度的当前 bin 值。

对于这种情况,我需要一个 for loop 脚本。使用所有for loop 选项我真的有点困惑,有人可以帮我解决这个问题吗?

注意:我从下面的DataFrame 脚本中获得了这些值:

uncut = df.groupby(pd.cut(df.normalized_speed, ws_bin))['pt_power_avg', 'normalized_speed'].mean() 

数据表:

normalized_speed    pt_power_avg [Pi] normalized_speed [Vi]  *sensitivity*
[Ci]"
(0, 0.5]                 0                        0                   -   
(0.5, 1]                 0                        0                   -   
(1, 1.5]                 0                        0                   -   
(1.5, 2]                 0                        0                   -   
(2, 2.5]                 6.46                     2.44               2.6 
(2.5, 3]                14.22                     2.73              26.2 
(3, 3.5]                27.05                     3.26              24.4 
(3.5, 4]                56.67                     3.77              58.6 
(4, 4.5]                88.55                     4.26              64.7 
(4.5, 5]               121.95                     4.76              66.8 
(5, 5.5]               166.87                     5.26              89.5 
(5.5, 6]               221.16                     5.74             112.6 
(6, 6.5]               283.94                     6.26             122.4 
(6.5, 7]               310.32                     6.74              54.7 
(7, 7.5]               472.59                     7.29             297.0 
(7.5, 8]               582.02                     7.70             261.2 
(8, 8.5]               703.98                     8.17             261.1 
(8.5, 9]               927.60                     8.77             375.4 
(9, 9.5]               995.10                     9.11             194.1    

【问题讨论】:

    标签: python for-loop pandas slice


    【解决方案1】:

    使用shift() 而不是for looping

    在 pandas 中,您应该使用 shift 功能而不是 for looping。 Pandas 旨在对数据列执行这些精确类型的计算,而无需在每一行上添加for looping

    假设您的原始数据位于名为 dfDataFrame 中,则等式将表示为

    # Calculate equation (broken into numerator and denominator for example)
    numerator = df['pt_power_avg [Pi]'] - df['pt_power_avg [Pi]'].shift()
    denominator = df['normalized_speed [Vi]'] - df['normalized_speed [Vi]'].shift()
    calculated_sensitivity = (numerator / denominator).abs()
    
    # Add to DataFrame
    print 'Calculated Sensitivity:'
    print calculated_sensitivity
    print
    

    Calculated Sensitivity:
    normalized_speed
    (0, 0.5]           NaN
    (0.5, 1]           NaN
    (1, 1.5]           NaN
    (1.5, 2]           NaN
    (2, 2.5]      2.647541
    (2.5, 3]     26.758621
    (3, 3.5]     24.207547
    (3.5, 4]     58.078431
    (4, 4.5]     65.061224
    (4.5, 5]     66.800000
    (5, 5.5]     89.840000
    (5.5, 6]    113.104167
    (6, 6.5]    120.730769
    (6.5, 7]     54.958333
    (7, 7.5]    295.036364
    (7.5, 8]    266.902439
    (8, 8.5]    259.489362
    (8.5, 9]    372.700000
    (9, 9.5]    198.529412
    dtype: float64
    

    【讨论】:

    • 很高兴能帮上忙!
    • 嗨,我遇到了一个问题,在上表中的 [1.5-2.0] 之前,Dataframe 的风速和功率为 NaN,而不是上表中的“0”。所以当我使用上面的公式我在 [1.5-2.0] 处得到“NaN”,而不是像我在 excel 和您的计算中计算的那样敏感为 2.6。这是因为数据框中的 NaN。我使用 df.fillna(0 ),但仍然无法正常工作。
    • 我不确定你在问什么。您可以将原始数据连同您的代码和输出一起发布吗?我可以尝试调试你的计算。
    【解决方案2】:

    我的结果低于 [2,2.5] 中没有 2.6

           normalized_speed
    (0, 0.5]            NaN
    (0.5, 1]            NaN
    (1, 1.5]            NaN
    (1.5, 2]            NaN
    (2, 2.5]            NaN
    (2.5, 3]      26.180203
    (3, 3.5]      24.390952
    (3.5, 4]      58.638289
    (4, 4.5]      64.677315
    (4.5, 5]      66.751720
    (5, 5.5]      89.462064
    (5.5, 6]     112.621292
    (6, 6.5]     122.390346
    (6.5, 7]      54.709085
    (7, 7.5]     296.962721
    (7.5, 8]     261.151143
    (8, 8.5]     261.063389
    (8.5, 9]     375.387079
    (9, 9.5]     194.122176
    (9.5, 10]           NaN
    dtype: float64
    

    【讨论】:

    • 不,您可以看到 (2.5,2.5] 处的计算灵敏度值显示为 NaN。但这应该具有 2.6 的值...我相信这是因为 Dataframe 中的 NaN。我试图通过 .fillna(0) 消除,但它不起作用
    • uncert= df.groupby(pd.cut(df.normalized_speed,ws_bin))['pt_power_avg','normalized_speed'].mean().fillna(0) 我应用了 fillna(0)在数据框的末尾及其工作。感谢您的跟进 tmthydvnprt
    • 就像我说的,没有看到你的代码和数据,我帮不了你......对不起。很高兴它成功了。
    • 谢谢老兄,我试过了,成功了。我了解数据要求,如果我还没有解决,我可以发布数据。但实际上,您的单个代码对我有很大帮助,而且我以不同的方式使用它。非常感谢兄弟
    猜你喜欢
    • 2021-01-13
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 2017-06-15
    • 2017-09-19
    相关资源
    最近更新 更多