【问题标题】:Pandas dataframe conditional interpolation on a specific variablePandas 数据帧对特定变量的条件插值
【发布时间】:2021-10-13 15:22:50
【问题描述】:

继续我的上一个问题

假设我将数据框扩展为如下所示的内容

import pandas as pd
import numpy as np

na = np.nan

df = pd.DataFrame({
    'location' : ['a','a','a','a','a','b','b','b','b','b'],
    'temp' : [11.6,12.2,na,12.4,12.9,na,17.6,17.4,17.2,16.8],
    'precip': [0.22,0.22,0.24,na,0.27,0.33,na,0.34,0.34,0.37]
})

我只想填写 location a 上缺少的 temp 值。 我试过这样的事情

df[df['location'] == 'a']['temp'] = df[df['location'] == 'a']['temp'].interpolate()

它给了我这个错误

<string>:12: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
location  temp  precip
0        a  11.6    0.22
1        a  12.2    0.22
2        a   NaN    0.24
3        a  12.4     NaN
4        a  12.9    0.27
5        b   NaN    0.33
6        b  17.6     NaN
7        b  17.4    0.34
8        b  17.2    0.34
9        b  16.8    0.37

任何帮助或参考将不胜感激。 谢谢

【问题讨论】:

    标签: python pandas dataframe numpy


    【解决方案1】:

    使用DataFrame.loc:

    m = df['location'] == 'a'
    df.loc[m, 'temp'] = df.loc[m, 'temp'].interpolate()
    

    您的解决方案(如果 df 较大,则较慢,因为创建了 2 次掩码):

    df.loc[df['location'] == 'a', 'temp'] = df.loc[df['location'] == 'a', 'temp'].interpolate()
    

    【讨论】:

      【解决方案2】:

      您可以使用update 就地修改值。

      df.update(df.loc[df['location'] == 'a', 'temp'].interpolate())
      print(df)
      
      # Output:
        location  temp  precip
      0        a  11.6    0.22
      1        a  12.2    0.22
      2        a  12.3    0.24
      3        a  12.4     NaN
      4        a  12.9    0.27
      5        b   NaN    0.33
      6        b  17.6     NaN
      7        b  17.4    0.34
      8        b  17.2    0.34
      9        b  16.8    0.37
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        • 2020-08-27
        • 2022-08-03
        • 2022-11-23
        • 2019-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多