【发布时间】:2021-11-12 09:01:02
【问题描述】:
如果我有一个包含多列 ['x', 'y', 'z'] 的数据框,我如何只转发填充一列 'x'?还是一组列['x','y']?
我只知道按轴做。
【问题讨论】:
如果我有一个包含多列 ['x', 'y', 'z'] 的数据框,我如何只转发填充一列 'x'?还是一组列['x','y']?
我只知道按轴做。
【问题讨论】:
tl;博士:
cols = ['X', 'Y']
df.loc[:,cols] = df.loc[:,cols].ffill()
我还添加了一个自包含示例:
>>> import pandas as pd
>>> import numpy as np
>>>
>>> ## create dataframe
... ts1 = [0, 1, np.nan, np.nan, np.nan, np.nan]
>>> ts2 = [0, 2, np.nan, 3, np.nan, np.nan]
>>> d = {'X': ts1, 'Y': ts2, 'Z': ts2}
>>> df = pd.DataFrame(data=d)
>>> print(df.head())
X Y Z
0 0 0 0
1 1 2 2
2 NaN NaN NaN
3 NaN 3 3
4 NaN NaN NaN
>>>
>>> ## apply forward fill
... cols = ['X', 'Y']
>>> df.loc[:,cols] = df.loc[:,cols].ffill()
>>> print(df.head())
X Y Z
0 0 0 0
1 1 2 2
2 1 2 NaN
3 1 3 3
4 1 3 NaN
【讨论】:
SettingWithCopyWarning。担心这个警告有什么想法吗?
## apply forward fill with exclusion cols_ex = ['X', 'Y'] # define columns to exclude \\ cols = df.columns # get list with all columns \\ cols_to_ff = cols.drop(cols_ex) # drop columns to exclude \\ df.loc[:,cols_to_ff] = df.loc[:,cols_to_ff].ffill() # forward fill the selected columns \\
for col in ['X', 'Y']:
df[col] = df[col].ffill()
【讨论】:
两列可以同时为ffill(),如下所示:
df1 = df[['X','Y']].ffill()
【讨论】:
或者使用inplace 参数:
df['X'].ffill(inplace=True)
df['Y'].ffill(inplace=True)
不,你不能这样做df[['X','Y]].ffill(inplace=True),因为这首先会通过列选择创建一个切片,因此就地前向填充会创建一个 SettingWithCopyWarning。当然,如果您有一个列列表,您可以循环执行此操作:
for col in ['X', 'Y']:
df[col].ffill(inplace=True)
使用inplace的目的是避免复制列。
【讨论】:
我使用下面的代码,这里的 X 和 Y 方法也可以不同,而不是 ffill()。
df1 = df.fillna({
'X' : df['X'].ffill(),
'Y' : df['Y'].ffill(),
})
【讨论】:
我认为最简单的版本。
cols = ['X', 'Y']
df[cols] = df[cols].ffill()
【讨论】: