如果行具有相同的“A列”值,则用最后一个已知值填充空的“B列”单元格

2024-05-12 22:09:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python和数据科学非常陌生。你知道吗

我有一个大的数据集(有100K+行),在这个数据集中我有两列ABA是Datetime列,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

我试图实现这一点,但没有成功,我所能做的就是利用以下方法使B13具有NaN价值:

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

你们能告诉我实现这一目标的最简单最经济的方法是什么吗?你知道吗


Tags: 数据方法dfnp时间科学nanb0
3条回答

试试groupby().idxmax()

max_val = df.loc[df['A'].groupby(df['A'].dt.date).transform('idxmax'),'B'].values

df['B'] = np.where(df['B'].isna(), max_val, df['B'])

输出:

                    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

使用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

您的任务可以使用以下一行程序执行:

df.B = df.sort_values('A').groupby(pd.to_datetime(df.A).dt.date).B.ffill()

相关问题 更多 >