【问题标题】:Python: how to replace a column value in one dataframe from another without removing duplicatesPython:如何在不删除重复项的情况下从另一个数据框中替换一个数据框中的列值
【发布时间】:2020-03-16 18:59:18
【问题描述】:

我有两个数据框:一个来自 csv 文件,另一个是来自 sql db 的输出

DataFrame1 如下所示:(来自 csv 文件)df1

 |BId    |Timestamp    |SequenceNumber|TypeCode|LineNumber|Qty |Grade      |StartDate    |EndDate      
0|1002899|19/08/19 0:03|1355          |f       |10        |3.55|Aeiouswe   |18/08/19 4:49|20/08/19 1:00
1|1002899|19/08/19 0:04|1356          |f       |10        |8.4 |hdujeujdido|18/08/19 4:49|20/08/19 1:00
3|1002899|19/08/19 0:13|1357          |f       |10        |3.56|hdujeujdido|18/08/19 4:49|20/08/19 1:00
4|1002899|19/08/19 0:26|1358          |f       |10        |12.2|iueoe      |18/08/19 4:49|20/08/19 1:00
6|1001346|19/08/19 0:08|1844          |f       |10        |110 |derets     |18/08/19 4:49|20/08/19 1:00
7|1002867|19/08/19 1:39|1461          |f       |10        |21.8|derets     |18/08/19 4:49|20/08/19 1:00
8|1002867|19/08/19 1:39|1461          |f       |20        |500 |uijsts     |18/08/19 4:49|20/08/19 1:00

第二个数据帧来自 sql:df2

 |BId|SiteId
0|1001346|180
1|1002899|181
2|1002867|182
3|1002375|183
4|1002376|184
5|1002377|185
6|1002378|186
7|1002379|187
8|1002380|188
9|1002381|189
10|1000438|191
11|1000439|192
12|1000365|193
13|1000288|194
14|1000408|195
15|1001895|10006
16|1002870|10008
17|1002348|10009
18|1002358|10012

如果 df1 之间的 BId 与 df2 匹配,我想将 df1 中的 BId 列的值替换为 df2 中的 SiteId 列的值

我的预期输出如下所示:

 |BId    |Timestamp    |SequenceNumber|TypeCode|LineNumber|Qty |Grade      |StartDate    |EndDate      
0|181|19/08/19 0:03|1355          |f       |10            |3.55|Aeiouswe   |18/08/19 4:49|20/08/19 1:00
1|181|19/08/19 0:04|1356          |f       |10            |8.4 |hdujeujdido|18/08/19 4:49|20/08/19 1:00
3|181|19/08/19 0:13|1357          |f       |10            |3.56|hdujeujdido|18/08/19 4:49|20/08/19 1:00
4|181|19/08/19 0:26|1358          |f       |10            |12.2|iueoe      |18/08/19 4:49|20/08/19 1:00
6|180|19/08/19 0:08|1844          |f       |10            |110 |derets     |18/08/19 4:49|20/08/19 1:00
7|182|19/08/19 1:39|1461          |f       |10            |21.8|derets     |18/08/19 4:49|20/08/19 1:00
8|182|19/08/19 1:39|1461          |f       |20            |500 |uijsts     |18/08/19 4:49|20/08/19 1:00

我尝试过使用以下方法:

df1['BId'] = df1['BId'].map(df2.set_index('BId')['SiteId'])

但我收到以下错误 重新索引仅对具有唯一值的 Index 对象有效

考虑到我在 df1 中有 BId 的重复值,如何在不删除重复项的情况下替换这些值

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以尝试使用这种方式。我得到了想要的输出。对不起,我昨天给了不好的建议。希望它现在正在工作。 (昨天我错了,它需要字典而不是列表)

    import pandas as pd
    
    list1 = range(0,100,1)
    list2 = range(100,200,1)
    list3 = range(200,300,1)
    list4 = range(300,400,1)
    
    df1 = pd.DataFrame({"col1": list1,"col2":list1})
    df2 = pd.DataFrame({"col1": list2,"col2":list2})
    print(df1)
    
    dict = df2["col1"].to_dict()
    df3 = df1.replace({"col1": dict})
    print(df3)
    

    【讨论】:

      【解决方案2】:

      我敢肯定,会有更简单的方法来做到这一点,但我可以通过将 df1 和 df2 转换为列表来做到这一点 然后使用 for 循环替换值,然后将结果转换回数据框,如下所示:

      df1list = df1.values.tolist()
      df2list = df2.values.tolist()
      
      for n, i in enumerate(df1list):
        for j in df2list:
          if i[0] == j[0]:
            df1list[n][0] = j[1]
      
      df1 = pd.DataFrame.from_records(df1list , columns=['BId', 'Timestamp', 'SequenceNumber', 'Code', 'LineNumber', 'Qty','Grade', 'StartDate', 'EndDate'])
      

      【讨论】:

        【解决方案3】:

        嗯,不确定这是否可行。您可以尝试使用替换功能: 此函数需要知道必须替换哪个 Col,然后需要一个新值列表。 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.replace.html

        你可以试试:

        df1.replace({'BId': df2["SiteId"].tolist()})
        
        

        tolist() 应该只返回一个列的列表

        【讨论】:

        • 我试过这个方法,它只是打印df1,因为它没有做任何更改,也没有显示任何错误
        • @pybeginner 对不起,我累了。我发布了一个新答案,我自己尝试了这段代码。我想你应该能够做到这一点。我错了。它不需要列表,函数需要字典。
        猜你喜欢
        • 2018-08-01
        • 2019-05-09
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-14
        • 1970-01-01
        相关资源
        最近更新 更多