![](/img/trans.png)
[英]How to delete the first and last rows with NaN of a dataframe and replace the remaining NaN with the average of the values below and above?
[英]Delete and replace Nan values with mean of the rows in pandas dataframe
我有一个非常大的 DataFrame,看起来像:
c1 c2 c3
0 NaN 1.0 NaN
1 NaN NaN NaN
2 3.0 6.0 9.0
3 NaN 7.0 10.0
...
我想要:
1- 删除具有所有“Nan”值的行。 就像示例中的第二行。
2- 用行的平均值替换其他行中的所有“Nan”值。
注意:在行中,我们有不同的“Nan”值。 你能帮我吗? 谢谢。
此外,此链接不能解决我的问题: Pandas Dataframe:用行平均值替换 NaN
这是我的 DataFrame 的示例:
import pandas as pd
import numpy as np
df = pd.DataFrame()
df['c1'] = [np.nan, np.nan, 3, np.nan]
df['c2'] = [1, np.nan, 6, 7]
df['c3'] = [np.nan, np.nan, 9, 10]
更新:当我们不想考虑所有行的平均值时。 样本 dataframe:
import pandas as pd
import numpy as np
df = pd.DataFrame()
df['id'] = [1, 2, 3, 4, 5]
df['c1'] = [np.nan, np.nan, 3, np.nan, 5]
df['c2'] = [1, np.nan, 3, 11, 5]
df['c3'] = [1, np.nan, 3, 11, np.nan]
df['c4'] = [3, np.nan, 3, 11, 5]
output:
df = pd.DataFrame()
df['id'] = [1, 3, 4, 5]
df['c1'] = [ 5/3, 3, 11, 5]
df['c2'] = [1, 3, 11, 5]
df['c3'] = [1, 3, 11, 5]
df['c4'] = [3, 3, 11, 5]
df
对于这部分,我不想考虑 id 的值来计算行的平均值。
这个怎么样:
df = df.T.fillna(df.mean(axis=1)).T.dropna()
print(df)
output:
>>>
c1 c2 c3
0 1.0 1.0 1.0
2 3.0 6.0 9.0
3 8.5 7.0 10.0
您可以根据列名和行均值创建一个字典,并将其传递给fillna
以填充 NaN 值。 然后删除 NaN 行(不会被填充,因为所有 NaN 行的平均值都是 NaN)。
out = df.fillna(dict.fromkeys(df.columns, df.mean(axis=1))).dropna()
另一种可能是转置 DataFrame 并使用fillna
填充,然后转置回去:
df_T = df.T
df_T.fillna(df_T.mean()).T.dropna()
Output:
c1 c2 c3
0 1.0 1.0 1.0
2 3.0 6.0 9.0
3 8.5 7.0 10.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.