【问题标题】:Pandas: left merge on two DF using columns, but take only the last (or mean) of another columnPandas:使用列在两个 DF 上左合并,但只取另一列的最后一个(或平均值)
【发布时间】:2020-12-14 03:48:05
【问题描述】:

我有如下两个 DF:

| shopID | itemID |
|--------|--------|
|      2 |     30 |
|      2 |     31 |
|      2 |     32 |
|      2 |     33 |
|      2 |     38 |
| date | shopID | itemID | price  | cnt |
|------|--------|--------|--------|-----|
|  0.0 |    2.0 |   33.0 |  499.0 | 1.0 |
|  0.0 |    2.0 |  482.0 | 3300.0 | 1.0 |
|  0.0 |    2.0 |  491.0 |  600.0 | 1.0 |
|  0.0 |    2.0 |  839.0 | 3300.0 | 1.0 |
|  0.0 |    2.0 | 1007.0 |  449.0 | 3.0 |
...

第二个是时间序列 DF,其中date 是月份(为简单起见,从 0 开始,到 33 结束)。 shopIDitemID 的组合不能保证出现在两个 DF 中。我想在shopIDitemID 上将DF1 与DF2 合并。我做到了:

pd.merge(df1, df2, how="left", on=["shopID", "itemID"])

像往常一样,它给了我以下 DF:


| shopID | itemID | date | price  | cnt |
|--------|--------|------|--------|-----|
|      2 |     30 |  2.0 | 359.00 | 1.0 |
|      2 |     30 |  5.0 | 399.00 | 1.0 |
|      2 |     30 | 15.0 | 169.00 | 1.0 |
|      2 |     30 | 16.0 | 169.00 | 1.0 |
|      2 |     31 |  1.0 | 699.00 | 4.0 |
|      2 |     31 |  2.0 | 698.50 | 1.0 |
|      2 |     31 |  3.0 | 699.00 | 1.0 |
|      2 |     31 | 16.0 | 415.92 | 1.0 |
|      2 |     31 | 33.0 | 399.00 | 1.0 |
|      2 |     32 | 12.0 | 119.00 | 1.0 |
...

我的问题是:我想合并它们并拥有或最新价格(每个组合 shopID-itemID 中的 date 最大)。我该怎么做?

编辑:预期输出(仅上个月)

| shopID | itemID | date | prince | cnt |
|--------|--------|------|--------|-----|
|      2 |     30 | 16.0 |  169.0 | 1.0 |
|      2 |     31 | 33.0 | 399.00 | 1.0 |
|      2 |     32 | 31.0 | 149.00 | 1.0 |
...

【问题讨论】:

  • 请发布您的预期输出

标签: python pandas dataframe


【解决方案1】:

如果没有更多信息很难回答,这只是每个 itemID 的简单最大日期吗?如果是这样,可以像这样使用 drop_duplicates:

df = pd.DataFrame({'shopID': [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
 'itemID': [30, 30, 30, 30, 31, 31, 31, 31, 31, 32],
 'date': [2.0, 5.0, 15.0, 16.0, 1.0, 2.0, 3.0, 16.0, 33.0, 12.0],
 'price': [359.0,
  399.0,
  169.0,
  169.0,
  699.0,
  698.5,
  699.0,
  415.92,
  399.0,
  119.0],
 'cnt': [1.0, 1.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 1.0, 1.0]})

df.sort_values(by=['itemID', 'date']).drop_duplicates(subset=['itemID'], keep='last')

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 2020-12-13
    • 2021-11-20
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多