python - 如果行具有相同的“A 列”值,则用最后一个已知值填充空的“B 列”单元格
问题描述
我对 Python 和数据科学真的很陌生。
我有一个大数据集(有 100K+ 行),在这个数据集中我有两列A
和B
. A
是日期时间列,B 是字符串。
B 列有一些 NaN 值,我想用最新的已知 B 列值填充这些 NaN 值,条件是我的空 B 列行和已经填充的 B 列行在同一天、同一个月和同一年(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
推荐阅读
- reactjs - 我可以使用 React Native 围绕 Web 应用创建移动应用包装器,类似于 Cordova 创建移动应用的做法吗?
- markdown - 将 MathJax 与 kramdown 一起使用,而不在 div 中进行保护(如宣传的那样!)
- ag-grid - ag-grid:开始编辑树视图的 autoColumnDef
- r - 与 x 轴刻度作斗争
- php - Laravel 7多选一对多关系
- python - 大型模型的最佳批量大小和时期
- excel - Excel VBA列表框的列数
- python - 计算两幅图像的异或
- python - Python 中的 numpy.fft.fft() 实现
- reactjs - 输入单个字符后表单失去焦点?