【问题标题】:Python/Pandas Dataframe replace 0 with median valuePython/Pandas Dataframe 用中值替换 0
【发布时间】:2016-05-29 05:21:26
【问题描述】:

我有一个带有几列的 python pandas 数据框,其中一列有 0 值。我想用此列的medianmean 替换0 值。

data 是我的数据框
artist_hotness 是列

mean_artist_hotness = data['artist_hotness'].dropna().mean()

if len(data.artist_hotness[ data.artist_hotness.isnull() ]) > 0:
data.artist_hotness.loc[ (data.artist_hotness.isnull()), 'artist_hotness'] = mean_artist_hotness

我试过这个,但它不起作用。

【问题讨论】:

    标签: python pandas dataframe mean median


    【解决方案1】:

    使用pandasreplace方法:

    df = pd.DataFrame({'a': [1,2,3,4,0,0,0,0], 'b': [2,3,4,6,0,5,3,8]}) 
    
    df 
       a  b
    0  1  2
    1  2  3
    2  3  4
    3  4  6
    4  0  0
    5  0  5
    6  0  3
    7  0  8
    
    df['a']=df['a'].replace(0,df['a'].mean())
    
    df
       a  b
    0  1  2
    1  2  3
    2  3  4
    3  4  6
    4  1  0
    5  1  5
    6  1  3
    7  1  8
    

    【讨论】:

      【解决方案2】:

      我认为您可以使用mask 并将参数skipna=True 添加到mean 而不是dropna。如果需要替换 0 值或 data.artist_hotness.isnull() 如果需要替换 NaN 值,还需要将条件更改为 data.artist_hotness == 0

      import pandas as pd
      import numpy as np
      
      data = pd.DataFrame({'artist_hotness': [0,1,5,np.nan]})
      print (data)
         artist_hotness
      0             0.0
      1             1.0
      2             5.0
      3             NaN
      
      mean_artist_hotness = data['artist_hotness'].mean(skipna=True)
      print (mean_artist_hotness)
      2.0
      
      data['artist_hotness']=data.artist_hotness.mask(data.artist_hotness == 0,mean_artist_hotness)
      print (data)
         artist_hotness
      0             2.0
      1             1.0
      2             5.0
      3             NaN
      

      也可以使用loc,但省略列名:

      data.loc[data.artist_hotness == 0, 'artist_hotness'] = mean_artist_hotness
      print (data)
         artist_hotness
      0             2.0
      1             1.0
      2             5.0
      3             NaN
      
      data.artist_hotness.loc[data.artist_hotness == 0, 'artist_hotness'] = mean_artist_hotness
      print (data)
      

      IndexingError: (0 True 1 错误 2 错误 3 错误 名称:artist_hotness,dtype:bool,'artist_hotness')

      另一种解决方案是 DataFrame.replace 指定列:

      data=data.replace({'artist_hotness': {0: mean_artist_hotness}}) 
      print (data)
          aa  artist_hotness
      0  0.0             2.0
      1  1.0             1.0
      2  5.0             5.0
      3  NaN             NaN 
      

      或者如果需要替换所有列中的所有 0 值:

      import pandas as pd
      import numpy as np
      
      data = pd.DataFrame({'artist_hotness': [0,1,5,np.nan], 'aa': [0,1,5,np.nan]})
      print (data)
          aa  artist_hotness
      0  0.0             0.0
      1  1.0             1.0
      2  5.0             5.0
      3  NaN             NaN
      
      mean_artist_hotness = data['artist_hotness'].mean(skipna=True)
      print (mean_artist_hotness)
      2.0
      
      data=data.replace(0,mean_artist_hotness) 
      print (data)
          aa  artist_hotness
      0  2.0             2.0
      1  1.0             1.0
      2  5.0             5.0
      3  NaN             NaN
      

      如果需要替换所有列中的NaN,请使用DataFrame.fillna

      data=data.fillna(mean_artist_hotness) 
      print (data)
          aa  artist_hotness
      0  0.0             0.0
      1  1.0             1.0
      2  5.0             5.0
      3  2.0             2.0
      

      但如果只在某些列中使用Series.fillna

      data['artist_hotness'] = data.artist_hotness.fillna(mean_artist_hotness) 
      print (data)
          aa  artist_hotness
      0  0.0             0.0
      1  1.0             1.0
      2  5.0             5.0
      3  NaN             2.0
      

      【讨论】:

        【解决方案3】:
        data['artist_hotness'] = data['artist_hotness'].map( lambda x : data.artist_hotness.mean() if x == 0 else x)
        

        【讨论】:

          【解决方案4】:

          发现这些非常有用,虽然 mask 真的很慢(不知道为什么)。

          我这样做了:

          df.loc[ df['artist_hotness'] == 0 | np.isnan(df['artist_hotness']), 'artist_hotness' ] = df['artist_hotness'].median()
          

          【讨论】:

            【解决方案5】:

            我认为下面的代码将在一行中解决您的问题。

                data['artist_hotness'] = data['artist_hotness'].replace(0, 
                data['artist_hotness'].mean())
            

            【讨论】:

              猜你喜欢
              • 2019-08-15
              • 1970-01-01
              • 1970-01-01
              • 2014-06-12
              • 2018-11-14
              • 1970-01-01
              • 2021-09-05
              • 2021-11-28
              相关资源
              最近更新 更多