【问题标题】:How to copy values from one df to the original df with a certain condition?如何在特定条件下将值从一个df复制到原始df?
【发布时间】:2019-10-12 12:57:25
【问题描述】:

目前我正在研究聚类问题,我在将值从一个数据帧复制到原始数据帧时遇到了问题。

    CustomerID | Date |     Time| TotalSum | CohortMonth| CohortIndex
--------------------------------------------------------------------
0   |17850.0|2017-11-29||08:26:00|15.30|2017-11-01|1|
--------------------------------------------------------------------
1   |17850.0|2017-11-29||08:26:00|20.34|2017-11-01|1|
--------------------------------------------------------------------
2   |17850.0|2017-11-29||08:26:00|22.00|2017-11-01|1|
--------------------------------------------------------------------
3   |17850.0|2017-11-29||08:26:00|20.34|2017-11-01|1|
--------------------------------------------------------------------

以及带有要复制的值(集群)的数据框:

CustomerID|Cluster
------------------
12346.0   |     1
------------------
12346.0   |     1
------------------
12346.0   |     1
------------------

请帮我解决这个问题:如何根据客户 ID 标准将值从第二个 df 复制到第一个数据帧。

我试过这样的代码:

df.merge(ic,left_on='CustomerID',right_on='Cluster',how='left').drop('CustomerID',1).fillna('')

但它不起作用,我得到一个错误......

除此之外,它还尝试了以下代码的一个版本:

df, ic = [d.reset_index(drop=True) for d in (df, ic)]
ic.join(df[['CustomerID']])

但它会出现相同的错误或错误,例如 df 中没有的“客户 ID”... 抱歉,如果问题不明确且格式不正确……这是我在 stackoverflow 上的第一个问题。谢谢大家。

更新

我试过了

df1=df.merge(ic,left_on='CustomerID',right_on='Cluster',how='left')

 if ic['CustomerID'].values != df1['CustomerID_x'].values:
    df1.Cluster=ic.Cluster
 else:
    df1.Cluster='NaN'

但是我为同一个客户有不同的集群。

客户 ID_x|日期 |时间 |总和 |队列月 |队列索引 |客户 ID_y |集群

0|17850.0|2017-11-29||08:26:00|15.30 | 2017-11-01 | 1 |钠 | 1.0

1|17850.0|2017-11-29||08:26:00|20.34 | 2017-11-01 | 1 |钠 | 0.0

2|17850.0|2017-11-29||08:26:00|22.00 | 2017-11-01 | 1 |钠 | 1.0

3|17850.0|2017-11-29||08:26:00|20.34 | 2017-11-01 | 1 |钠 | 2.0

4|17850.0|2017-11-29||08:26:00|20.34 | 2017-11-01 | 1 |钠 | 1.0

【问题讨论】:

  • 如果您可以提供代码来初始化数据框,以便人们可以复制粘贴作为工作的基础,那将非常有帮助。像df1 = pd.DataFrame({'CustomerID':[0, 1, ... 这样的东西,如果你可以用反引号to make it read more like code 包围你的内联代码,那就太好了。
  • 这里是link,用于下载带有数据的 csv 文件。我已经对原始集进行了很大的更改,所以我将带有转换后数据的文件提供给您
  • 我试过 df.merge(ic,left_on='CustomerID',right_on='Cluster',how='left').drop('CustomerID',1).fillna('') 并在 df 中得到了空列 'Cluster'。我做错了什么?

标签: python arrays pandas dataframe copy


【解决方案1】:

鉴于你写的,我认为你想要:

>>> df1 = pd.DataFrame({"CustomerID": [17850.0] * 4, "CohortIndex": [1,1,1,1] })
>>> df1
   CustomerID  CohortIndex
0     17850.0            1
1     17850.0            1
2     17850.0            1
3     17850.0            1

>>> df2
   CustomerID  Cluster
0     12346.0        1
1     17850.0        1
2     12345.0        1

>>> pd.merge(df1, df2, 'left', 'CustomerID')
   CustomerID  CohortIndex  Cluster
0     17850.0            1        1
1     17850.0            1        1
2     17850.0            1        1
3     17850.0            1        1

【讨论】:

  • 是的,你完全正确。我需要查找 excel 函数,如果你知道它是如何工作的
猜你喜欢
  • 2020-04-07
  • 2022-12-03
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多