Pandas 用 groupby 填充缺失值
Pandas fill missing values with groupby
我有 table 个按日期和代码分组的各种指标。我正在尝试用前一天的数据或如果不可用 - 用第二天的每个代码的数据填充缺失值。
问题是当我按 'Code' 和 'Date' 分组时,没有任何反应
df = pd.DataFrame([['2019-05-01', 'APL', 15951, 303, 49],
['2019-05-02', 'APL', 16075, 301, 46],
['2019-05-03', 'APL', np.nan, 300, 45],
['2019-05-04', 'APL', 15868, 298.8, 33],
['2019-05-01', 'MSK', 2222, np.nan, np.nan],
['2019-05-02', 'MSK', 2224, 243, 53],
['2019-05-03', 'MSK', 2266, 233, 33],
['2019-05-04', 'MSK', np.nan, 253, 55]],
columns=['Date', 'Code', 'Price', 'Volume', 'ATM'])
这是我正在尝试的:
df.groupby(['Code','Date'])['Price','Volume', 'ATM'].fillna(method = 'ffill')
你需要:
df.groupby(['Code']).apply(lambda x: x.ffill().bfill())
输出:
Code Date Price Volume ATM
0 APL 2019-05-01 15951.0 303.0 49.0
1 APL 2019-05-02 16075.0 301.0 46.0
2 APL 2019-05-03 16075.0 300.0 45.0
3 APL 2019-05-04 15868.0 298.8 33.0
4 MSK 2019-05-01 2222.0 243.0 53.0
5 MSK 2019-05-02 2224.0 243.0 53.0
6 MSK 2019-05-03 2266.0 233.0 33.0
7 MSK 2019-05-04 2266.0 253.0 55.0
如果你分组['Date', 'Code']
,每一天都成为一个组,在这个组内,不会有任何缺失值。
您可以执行以下操作:
df.set_index(['Date', 'Code'], inplace=True)
df['Price'].fillna(method='ffill', inplace=True)
df
要应用于特定列,我使用。
for col in list_of_cols: # Replace with your list of column name
df[col] = df.groupby('Code')[col].transform(lambda x: x.ffill().bfill())
我有 table 个按日期和代码分组的各种指标。我正在尝试用前一天的数据或如果不可用 - 用第二天的每个代码的数据填充缺失值。
问题是当我按 'Code' 和 'Date' 分组时,没有任何反应
df = pd.DataFrame([['2019-05-01', 'APL', 15951, 303, 49],
['2019-05-02', 'APL', 16075, 301, 46],
['2019-05-03', 'APL', np.nan, 300, 45],
['2019-05-04', 'APL', 15868, 298.8, 33],
['2019-05-01', 'MSK', 2222, np.nan, np.nan],
['2019-05-02', 'MSK', 2224, 243, 53],
['2019-05-03', 'MSK', 2266, 233, 33],
['2019-05-04', 'MSK', np.nan, 253, 55]],
columns=['Date', 'Code', 'Price', 'Volume', 'ATM'])
这是我正在尝试的:
df.groupby(['Code','Date'])['Price','Volume', 'ATM'].fillna(method = 'ffill')
你需要:
df.groupby(['Code']).apply(lambda x: x.ffill().bfill())
输出:
Code Date Price Volume ATM
0 APL 2019-05-01 15951.0 303.0 49.0
1 APL 2019-05-02 16075.0 301.0 46.0
2 APL 2019-05-03 16075.0 300.0 45.0
3 APL 2019-05-04 15868.0 298.8 33.0
4 MSK 2019-05-01 2222.0 243.0 53.0
5 MSK 2019-05-02 2224.0 243.0 53.0
6 MSK 2019-05-03 2266.0 233.0 33.0
7 MSK 2019-05-04 2266.0 253.0 55.0
如果你分组['Date', 'Code']
,每一天都成为一个组,在这个组内,不会有任何缺失值。
您可以执行以下操作:
df.set_index(['Date', 'Code'], inplace=True)
df['Price'].fillna(method='ffill', inplace=True)
df
要应用于特定列,我使用。
for col in list_of_cols: # Replace with your list of column name
df[col] = df.groupby('Code')[col].transform(lambda x: x.ffill().bfill())