如何在python中填充NaN值?

时间:2017-08-06 11:48:13

标签: python pandas

平均图表:

interval        gross(mean)
(1920, 1925]    NaN
(1925, 1930]    3.443000e+06
(1930, 1935]    4.746000e+05
(1935, 1940]    2.011249e+06

我有一个巨大的数据框(df),其总列中有一些Nan值 现在我想根据各自的间隔从平均图表中填充那些Nan值。

DF:

name gross interval
 k    1000   (1935, 1940]
 l     Nan   (1950, 1955]

,,,

此处间隔是分类索引。

2 个答案:

答案 0 :(得分:1)

您可以使用平均图表向数据框添加具有相应平均值的列(您可以通过加入pd.merge列,使用interval进行左连接)。获得此列后,您可以使用 -

df['gross'].fillna(df['means'])

答案 1 :(得分:1)

您可以按map创建新的Series,然后将NaN替换为combine_first

主要优点是没有必要的辅助列,必须在以后删除。

df1=pd.DataFrame({'gross(mean)':[np.nan,3.443000e+06, 4.746000e+05, 2.011249e+06, 10,20,30],
                   'interval':[1922,1927,1932, 1938,1932,1938,1953]})
df1['interval'] = pd.cut(df1['interval'], bins=[1920,1925,1930,1935,1940,1945,1950,1955])
print (df1)
   gross(mean)      interval
0          NaN  (1920, 1925]
1    3443000.0  (1925, 1930]
2     474600.0  (1930, 1935]
3    2011249.0  (1935, 1940]
4         10.0  (1930, 1935]
5         20.0  (1935, 1940]
6         30.0  (1950, 1955]

df = pd.DataFrame({'name':['k','l'],
                   'gross':[1000, np.nan],
                   'interval':[1938, 1952]}, columns=['name','gross','interval'])
df['interval'] = pd.cut(df['interval'], bins=[1925,1930,1935,1940,1945,1950,1955])
print (df)
  name   gross      interval
0    k  1000.0  (1935, 1940]
1    l     NaN  (1950, 1955]

mapped = df['interval'].map(df1.set_index('interval')['gross(mean)'].to_dict())
print (mapped)
0    20.0
1    30.0
Name: interval, dtype: float64
df['gross'] = df['gross'].combine_first(mapped)
print (df)
  name   gross      interval
0    k  1000.0  (1935, 1940]
1    l    30.0  (1950, 1955]