python - 如果行具有相同的 "B column"值,则用最后已知值填充空 "A column"单元格

标签 python pandas dataset data-science

我真的是 Python 和数据科学的新手。

我有一个很大的数据集(超过 100K 行),在这个数据集中我有两列 ABA 是日期时间列,B 是字符串。

B 列有一些 NaN 值,我想用最新已知的 B 列值填充这些 NaN 值,前提是我的空 B 列行和已填充的 B 列行在同一天、同一月和同一年(Column A).

让我解释一下我自己:

假设这是我的输入:

df=pd.DataFrame({'A': ["2019-03-13 08:12:23", "2019-03-13 07:10:18", "2019-03-20 08:12:23", "2019-03-13 08:12:23", "2019-03-15 10:35:53", "2019-03-20 11:12:23"], 'B': ["B1", "B0", "B13", np.nan, "B10", "B12"]})
                     A    B
0  2019-03-13 08:12:23   B1
1  2019-03-13 07:10:18   B0
2  2019-03-20 08:12:23  B13
3  2019-03-13 08:12:23  NaN
4  2019-03-15 10:35:53  B10
5  2019-03-20 11:12:23  B12

我想用 B1 填充 NaN 值(B 值在同一天出现并且具有最大时间,前提是这个“最大时间”不在实际 A 列之前值)。

所以我的输出应该是这样的:

                     A    B
0  2019-03-13 08:12:23   B1
1  2019-03-13 07:10:18   B0
2  2019-03-20 08:12:23  B13
3  2019-03-13 08:12:23   B1
4  2019-03-15 10:35:53  B10
5  2019-03-20 11:12:23  B12

我试图实现这一点但没有成功,我能做的最好的就是使用这个将 NaN 值设为 B13:

df['B']=df['B'].replace({'B': {0: np.nan}}).ffill()

你们能告诉我实现这一目标的最快和最经济的方法是什么吗?

最佳答案

使用groupby+ffill

as_date = pd.to_datetime(df.A)
s = np.argsort(as_date)

df['B'] = df.B.loc[s].groupby(as_date.loc[s].dt.date).ffill().loc[df.index]

                     A    B
0  2019-03-13 08:12:23   B1
1  2019-03-13 07:10:18   B0
2  2019-03-20 08:12:23  B13
3  2019-03-13 08:12:23   B1
4  2019-03-15 10:35:53  B10
5  2019-03-20 11:12:23  B12

关于python - 如果行具有相同的 "B column"值,则用最后已知值填充空 "A column"单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58419568/

相关文章:

python - 将 2 个数据帧 append 在一起并在 append 时增加等级

python - 如何根据设定的条件转发pandas数据框中的填充非空值

python - Keras 返回二进制结果

python - 与 tkinter 同时使用 .pack() 和 .grid()

python - 加速 pd.concat 的方法或使用其他方法连接表

.net - 使用 LINQ 从数据集中选择行,其中 RowsID 的列表位于 List<T>

c# - 如何在数据集中搜索特定数据

python - 如何将两个 tf.data.Dataset 合并为一个具有已知比率的交替元素

python - 根据字典赋值

python - 正则表达式 - 字符串替换 "as is"