如何从另一列的值转发填充一列的空值?
How to forward fill null values of one column from the values of another column?
我正在尝试用 'end_daily_count' 中的先前索引值填充列 'beginning_daily_count' 中的空值。起始数据集为:
d = {
'id': [1, 1, 1, 1, 1, 2, 2, 2, 2],
'beginning_daily_count': [30, 33, 37, 46, None, 7, 1, None, 2],
'end_daily_count': [33, 37, 46, 52, 33, 7, 1, 2, 3],
'foils': [0, 0, 0, 0, 0, 0, 0, 1, 1]
}
所需的数据集将是:
d = {
'id': [1, 1, 1, 1, 1, 2, 2, 2, 2],
'beginning_daily_count': [30, 33, 37, 46, 52, 33, 1, 1, 2],
'end_daily_count': [33, 37, 46, 52, 33, 7, 1, 2, 3],
'foils': [0, 0, 0, 0, 0, 0, 0, 1, 1]
}
我尝试了以下 ffill() 和 iloc() 方法,但无济于事。诚然,我对 ffill 和 iloc 经验不多。
d.iloc[beginning_daily_count.isna()].values = d.iloc[d.end_daily_count- 1].values
d['beginning_daily_count'].transform(lambda x: x.ffill(d['end_daily_count']))
DataFrame.fillna
方法可以接受一个系列作为其第一个参数,因此您可以将 end_daily_count
列的移位版本传递给它。假设您可以在不同 id
之间共享数据:
df['beginning_daily_count'] = df['beginning_daily_count'].fillna(df['end_daily_count'].shift())
print(df)
id beginning_daily_count end_daily_count foils
0 1 30.0 33 0
1 1 33.0 37 0
2 1 37.0 46 0
3 1 46.0 52 0
4 1 52.0 33 0
5 2 7.0 7 0
6 2 1.0 1 0
7 2 1.0 2 1
8 2 2.0 3 1
您可以 fillna
the column with the shifted other column per group (using GroupBy.shift
避免将值从一组泄漏到下一组):
df['beginning_daily_count'] = (df['beginning_daily_count']
.fillna(df.groupby('id')['end_daily_count'].shift(),
downcast='infer')
)
输出:
id beginning_daily_count end_daily_count foils
0 1 30 33 0
1 1 33 37 0
2 1 37 46 0
3 1 46 52 0
4 1 52 33 0
5 2 7 7 0
6 2 1 1 0
7 2 1 2 1
8 2 2 3 1
当 beginning_daily_count 设置为替换
时,这将查看以前的索引并找到 'end_daily_count' 以前的
df.replace(np.nan, 'Replace', inplace=True)
df['beginning_daily_count'] = np.where(df['beginning_daily_count'] == 'Replace', df.iloc[df.index - 1]['end_daily_count'], df['beginning_daily_count'])
df['beginning_daily_count'] = df['beginning_daily_count'].astype(int)
df
我正在尝试用 'end_daily_count' 中的先前索引值填充列 'beginning_daily_count' 中的空值。起始数据集为:
d = {
'id': [1, 1, 1, 1, 1, 2, 2, 2, 2],
'beginning_daily_count': [30, 33, 37, 46, None, 7, 1, None, 2],
'end_daily_count': [33, 37, 46, 52, 33, 7, 1, 2, 3],
'foils': [0, 0, 0, 0, 0, 0, 0, 1, 1]
}
所需的数据集将是:
d = {
'id': [1, 1, 1, 1, 1, 2, 2, 2, 2],
'beginning_daily_count': [30, 33, 37, 46, 52, 33, 1, 1, 2],
'end_daily_count': [33, 37, 46, 52, 33, 7, 1, 2, 3],
'foils': [0, 0, 0, 0, 0, 0, 0, 1, 1]
}
我尝试了以下 ffill() 和 iloc() 方法,但无济于事。诚然,我对 ffill 和 iloc 经验不多。
d.iloc[beginning_daily_count.isna()].values = d.iloc[d.end_daily_count- 1].values
d['beginning_daily_count'].transform(lambda x: x.ffill(d['end_daily_count']))
DataFrame.fillna
方法可以接受一个系列作为其第一个参数,因此您可以将 end_daily_count
列的移位版本传递给它。假设您可以在不同 id
之间共享数据:
df['beginning_daily_count'] = df['beginning_daily_count'].fillna(df['end_daily_count'].shift())
print(df)
id beginning_daily_count end_daily_count foils
0 1 30.0 33 0
1 1 33.0 37 0
2 1 37.0 46 0
3 1 46.0 52 0
4 1 52.0 33 0
5 2 7.0 7 0
6 2 1.0 1 0
7 2 1.0 2 1
8 2 2.0 3 1
您可以 fillna
the column with the shifted other column per group (using GroupBy.shift
避免将值从一组泄漏到下一组):
df['beginning_daily_count'] = (df['beginning_daily_count']
.fillna(df.groupby('id')['end_daily_count'].shift(),
downcast='infer')
)
输出:
id beginning_daily_count end_daily_count foils
0 1 30 33 0
1 1 33 37 0
2 1 37 46 0
3 1 46 52 0
4 1 52 33 0
5 2 7 7 0
6 2 1 1 0
7 2 1 2 1
8 2 2 3 1
当 beginning_daily_count 设置为替换
时,这将查看以前的索引并找到 'end_daily_count' 以前的df.replace(np.nan, 'Replace', inplace=True)
df['beginning_daily_count'] = np.where(df['beginning_daily_count'] == 'Replace', df.iloc[df.index - 1]['end_daily_count'], df['beginning_daily_count'])
df['beginning_daily_count'] = df['beginning_daily_count'].astype(int)
df