如何基于fillna或replace中的条件替换数据帧中的零和nan值

时间:2017-07-02 07:17:35

标签: python csv pandas numpy dataframe

我有一个像这样的数据框

Temp_in_C   Temp_in_F   Date          Year   Month   Day
   23          65       2011-12-12     2011    12     12
   12          72       2011-12-12    2011     12      12
   NaN         67       2011-12-12     2011    12      12
   0           0        2011-12-12     2011    12      12
   7           55       2011-12-13     2011    12       13

我正在尝试以这种格式输出(NaN和pertuculer day的零值仅由当天的avg temp取代) 输出将是

Temp_in_C   Temp_in_F   Date          Year   Month   Day
   23          65       2011-12-12     2011    12     12
   12          72       2011-12-12    2011     12      12
   17.5        67       2011-12-12     2011    12      12
   17.5        68       2011-12-12     2011    12      12
   7           55       2011-12-13     2011    12       13

这些价​​值将被相应的日期所取代。我正在努力做到这一点

temp_df = csv_data_df[csv_data_df["Temp_in_C"]!=0]
temp_df["Temp_in_C"] = 
temp_df["Temp_in_C"].replace('*',np.nan)
x=temp_df["Temp_in_C"].mean()   
csv_data_df["Temp_in_C"]=csv_data_df["Temp_in_C"]
.replace(0.0,x)
csv_data_df["Temp_in_C"]=csv_data_df["Temp_in_C"]
.fillna(x)

此代码采用整列的平均值并直接替换它。 我如何按天分组并取平均值,然后仅替换该特定日期的值。

1 个答案:

答案 0 :(得分:0)

首先,用NaN

替换零
df = df.replace(0,np.nan)

然后使用transform填充缺失的值(请参阅此post

df.groupby('Date').transform(lambda x: x.fillna(x.mean()))

给出:

   Temp_in_C  Temp_in_F  Year  Month  Day
0       23.0       65.0  2011     12   12
1       12.0       72.0  2011     12   12
2       17.5       67.0  2011     12   12
3       17.5       68.0  2011     12   12
4        7.0       55.0  2011     12   13