平均图表:
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]
,,,
此处间隔是分类索引。
答案 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]