我在数据框中有一个列,例如:
df = [ A
7280.0
7330.0
635.0
540.0
NaN ]
我想做的是删除最后一个0(从728 0 和733 0 ),然后用平均值替换NAN(在此示例中(在此示例中)728 733 635 540)/4 = 659)。最好的方法是什么?
我认为您需要mask
的过滤器,并通过10
应用地板除法。mean
的最后fillna
:
df.A = df.A.mask( df.A // 1000 > 0, df.A // 10)
df.A = df.A.fillna(df.A.mean())
print (df)
A
0 728.0
1 733.0
2 635.0
3 540.0
4 659.0
谢谢Dyz的另一种解决方案:
df[df.A>1000]/=10
df.A.fillna(df.A.mean(), inplace=True)
print (df)
A
0 728.0
1 733.0
2 635.0
3 540.0
4 659.0
通过评论编辑:
df = pd.DataFrame({'A': ['7280.0', '7330.0', '635.0', '540.0', np.nan, 'a']})
print (df)
A
0 7280.0
1 7330.0
2 635.0
3 540.0
4 NaN
5 a
df.A = pd.to_numeric(df.A, errors='coerce')
print (df)
A
0 7280.0
1 7330.0
2 635.0
3 540.0
4 NaN
5 NaN
df.A = df.A.mask( df.A // 1000 > 0, df.A // 10)
df.A = df.A.fillna(df.A.mean())
print (df)
A
0 728.0
1 733.0
2 635.0
3 540.0
4 659.0
5 659.0
使用pandas.Series.apply()
和pd.to_numeric()
功能的另一种替代解决方案:
df = pd.DataFrame(['A', 7280.0, 7330.0, 635.0, 540.0, 'NaN'])
df[0] = df[0].apply(lambda x: int(str(x)[:-3]) if (isinstance(x, float) and len(repr(x)) == 6 and x % 10.0 == 0.0) else x)
df[df == 'NaN'] = pd.to_numeric(df[0], errors='coerce').mean()
print(df)
输出:
0
0 A
1 728
2 733
3 635
4 540
5 659