【发布时间】:2021-05-12 03:16:46
【问题描述】:
我想用 groupby 对象中的值更新 Pandas DataFrame 列的 NA 值。
我们用一个例子来说明:
我们有以下 DataFrame 列:
|--------|-------|-----|-------------|
| row_id | Month | Day | Temperature |
|--------|-------|-----|-------------|
| 1 | 1 | 1 | 14.3 |
| 2 | 1 | 1 | 14.8 |
| 3 | 1 | 2 | 13.1 |
|--------|-------|-----|-------------|
我们只是每天多次测量温度,持续数月。现在,让我们假设对于我们的一些记录,温度读数失败并且我们有一个NA。
|--------|-------|-----|-------------|
| row_id | Month | Day | Temperature |
|--------|-------|-----|-------------|
| 1 | 1 | 1 | 14.3 |
| 2 | 1 | 1 | 14.8 |
| 3 | 1 | 2 | 13.1 |
| 4 | 1 | 2 | NA |
| 5 | 1 | 3 | 14.8 |
| 6 | 1 | 4 | NA |
|--------|-------|-----|-------------|
我们可以只使用 panda 的 .fillna(),但是我们想要更复杂一点。由于每天有多个读数(每天可能有 100 个),我们想取每日平均值并将其用作我们的填充值。
我们可以通过简单的 groupby 获得每日平均值:
avg_temp_by_month_day = df.groupby(['month'])['day'].mean()
这为我们提供了按月计算每一天的方法。问题是,如何最好地用 groupby 值填充 NA 值?
我们可以使用apply(),
df['temperature'] = df.apply(
lambda row: avg_temp_by_month_day.loc[r['month'], r['day']] if pd.isna(r['temperature']) else r['temperature'],
axis=1
)
但这确实很慢(超过 100 万条记录)。
是否有矢量化方法,可能使用np.where(),或者可能创建另一个系列并合并。
执行此操作的更有效方法是什么?
谢谢!
【问题讨论】:
-
我也在考虑使用
df.update()- 但我还不确定如何对齐 groupby 对象。