簡體   English   中英

熊貓數據框:用該行的均值替換nan

[英]Pandas data frame: replace nan with the mean of that row

假設我有以下數據框:

import numpy as np
import pandas as pd
df = pd.DataFrame({'A' : [np.nan, 1,2], 
                                  'B' : [3, np.nan, 4], 
                                  'C': [5,6,np.nan]}).T

>>df
    0   1   2
A NaN   1   2
B   3 NaN   4
C   5   6 NaN

要更換np.nan在該行的平均np.nan發生后,我用了fillna方法如下:

fill_value = pd.DataFrame({col: df.mean(axis=1) for col in df.columns})
df.fillna(fill_value, inplace=True)

Yields:
     0    1    2
A  1.5  1.0  2.0
B  3.0  3.5  4.0
C  5.0  6.0  5.5

我不確定為什么我無法獲得填充方法來執行相同的操作:

mask = np.isnan(df)
masked_df = np.ma.masked_array(df, mask)
means = np.mean(masked_df, axis=0)
df = masked_df.filled(means)

Yields: 
array([[ 4. ,  1. ,  2. ],
       [ 3. ,  3.5,  4. ],
       [ 5. ,  6. ,  3. ]])

知道如何獲取filled方法來做同樣的事情嗎? 謝謝。

這是因為在填充的示例中,平均值計算是錯誤的(您使用axis = 0而不是1)。 如果我使用第一個示例中的fill_values看起來不錯,

import numpy as np
import pandas as pd
df = pd.DataFrame({'A' : [np.nan, 1,2], 
                                  'B' : [3, np.nan, 4], 
                                  'C': [5,6,np.nan]}).T
mask = np.isnan(df)
masked_df = np.ma.masked_array(df, mask)
fill_value = pd.DataFrame({col: df.mean(axis=1) for col in df.columns})
df = masked_df.filled(fill_value)
print(df)

輸出:

[[ 1.5  1.   2. ]
 [ 3.   3.5  4. ]
 [ 5.   6.   5.5]]

在下面的工作中,您可以計算逐行均值,並將其作為替換NaN值的值進行傳遞,您必須對均值進行轉置以便正確執行對齊:

In [154]:
df.fillna(df.mean(axis=1).T, axis=0)

Out[154]:
     0    1    2
A  1.5  1.0  2.0
B  3.0  3.5  4.0
C  5.0  6.0  5.5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM