根据日期和不同数据框中的匹配值将值替换为 Nan

时间:2021-02-05 16:22:28

标签: python pandas dataframe

我有两个数据框。其中一个(客户)包含所有具有“ID”和“注册日期”的客户。

id                      date_joined
123 2019-09-12 17:05:27.916301+00:00
1234 2019-12-29 14:39:34.024478+00:00
1235 2020-03-09 12:47:52.284569+00:00
1236 2020-03-19 10:07:41.222140+00:00
1237 2020-03-19 06:34:25.896585+00:00

在第二个数据框(营业额)中,我有客户 ID 和 year_month 以及 turnover_sum。需要重点指出的是:对于每个客户 ID,该数据框中都有几行,因为它会在很长一段时间内跟踪月周转量。

ID  year_month       monthly_turnover
264  2019-Oct                 0
264  2019-Nov                 200
264  2019-Dec                 150
264  2020-Jan                 30
265  2020-Oct                 14

如果 year_month 列中的值早于相应用户的“注册日期”,我想为每个客户做的是,将monthly_turnover 列中的所有值替换为 Nan。

如何实现?我不知道从哪里开始。

2 个答案:

答案 0 :(得分:0)

您可以在一行(公认的密集)中完成此操作:

turnover.loc[turnover['year_month'] < customers['date'], 'monthly_turnover'] = np.nan

这一行包含了很多内容,所以让我逐项拆开包装:

turnover['year_month'] < customers['date']

Pandas 知道日期,因此假设您的索引匹配,pandas 可以自动检查一个日期是否在另一个日期之后。该子句将返回一系列 True 和 False。

然后我们将该系列带入 .loc 函数。这将匹配布尔值为 True 的每一行,然后将 'monthly_turnover' 设置为 NaN。

你需要将 numpy 作为 np 导入 np.nan 才能工作。

这给了我以下输出:

enter image description here

如果您需要更多,请告诉我们,希望这会有所帮助!

答案 1 :(得分:0)

我找到了解决问题的方法。我已经合并了两个数据框,然后使用 np.where 条件来比较 year_month 列和 date_joined 列的值。

merged.pf["monthly_turnover"] = np.where(
merged.pf["year_month"] >= merged.pf["date_joined"],
merged.pf["monthly_turnover"], np.nan)

无论如何感谢您的输入