假设我有以下数据框:
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
我不确定为什么我不能用filled方法做同样的事情:
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
方法做同样的事情吗?感谢。
答案 0 :(得分:3)
这是因为填充示例中的平均计算错误(使用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]]
答案 1 :(得分:1)
以下工作,您可以计算行方式并将其作为值替换 roc_sector roc_symbol
mean, max, min, count mean, max, min, count
date, industry
2015-03-15 Health 123, 675, 12, 6 35, 5677, 12, 7
2015-03-15 Mining 456, 687, 11, 9 54, 7897, 44, 3
2015-03-16 Health 346, 547, 34, 8 67, 7699, 23, 5
2015-03-16 Mining 234, 879, 34, 2 35, 3457, 23, 4
2015-03-17 Health 345, 875, 54, 6 45, 7688, 12, 8
2015-03-17 Mining 876, 987, 23, 7 56, 5656, 43, 9
值,您必须转置均值以便正确执行对齐:
NaN