【问题标题】:Python Pandas - New Column Returns earliest data for each unique IDPython Pandas - 新列返回每个唯一 ID 的最早数据
【发布时间】:2019-11-23 07:51:40
【问题描述】:

我有一个包含三列(客户 ID、交易、日期)的数据集。客户 ID 和交易之间存在一对多的关系。我想添加一个新列,其中包含每个唯一客户 ID 的最早购买数据。我尝试了下面的代码

df['First Purchase Date'] = df.loc[df.groupby('Customer ID').Date.idxmin(),:]

但是当我运行此代码时,我收到一条错误消息,指出在处理上述异常期间,发生了另一个异常:然后以一个值错误结束。它也不会创建名为 First Purchase Date 的新列。

有没有一种简单的方法可以在给定条件的另一列中找到一列中最早的数据?

我也尝试过使用 min()

df['First Purchase Date'] = df.groupby(['Customer ID'])['Date'].min()

这段代码创建了一个新列,这与我上面提到的第一行 idxmin 不同,但它给出了“NaN”作为所有内容的值。

【问题讨论】:

  • 阅读 stackoverflow 指南。您应该发布一个包含代码和数据的最小示例,显示错误,并发布错误本身。否则你会被否决
  • 此外,异常包含有价值的信息,可以告诉您代码中的错误之处。你应该仔细阅读它们
  • 异常是什么意思?我确实发布了上面的代码。这还不够吗?你还需要什么?
  • 首先,你得到的错误,你应该经常阅读它,并在你的问题中发布完整的错误。其次,您发布了 一些 代码,但不足以运行和重现您的问题。您需要发布一个显示错误的最小示例。
  • 顺便说一句,请注意下面的答案应该适合你

标签: python-3.x pandas data-cleaning


【解决方案1】:

这是您需要的代码

min_dates = df.groupby(['Customer ID'])['Date'].min()
df['First Purchase Date'] = df.apply(lambda row: min_dates.loc[row['Customer ID']], axis=1)

这是在一个最小的工作示例中的外观:

csv = """Customer ID,Date
1,2019
1,2018
1,2020
2,2000
2,2010
2,2005"""
from io import StringIO
import pandas as pd
df = pd.read_csv(StringIO(csv))

min_dates = df.groupby(['Customer ID'])['Date'].min()
df['First Purchase Date'] = df.apply(lambda row: min_dates.loc[row['Customer ID']], axis=1)
print(df)

这是输出

    Customer ID Date    First Purchase Date
0   1           2019    2018
1   1           2018    2018
2   1           2020    2018
3   2           2000    2000
4   2           2010    2000
5   2           2005    2000

【讨论】:

  • 感谢 Aviad。虽然我已经将它包含在我的代码中并且它可以工作,但我并不完全理解它,尤其是第二行。您对我可以阅读的内容有什么建议,以便更好地理解这一点。
  • 您需要了解 pandas 索引的工作原理。 df 每个事务有一行,min_dates 每个 Customer ID 有一行。所以你不能只从一个 DataFrame 分配给另一个。阅读更多 pandas 教程以及有关索引和 .apply 的文档。你会得到它的窍门
猜你喜欢
  • 2022-01-03
  • 1970-01-01
  • 2017-04-02
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 2020-06-24
  • 1970-01-01
相关资源
最近更新 更多