Python:如何从一个数据帧替换另一个数据帧中的列值而不删除重复项

Python:如何从一个数据帧替换另一个数据帧中的列值而不删除重复项,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个数据帧:一个来自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

我有两个数据帧:一个来自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'])
但是我得到了以下错误 重新索引仅对唯一值索引对象有效


考虑到我在df1中有重复的投标值,我如何在不删除重复值的情况下替换这些值呢。您可以尝试使用替换功能: 此函数需要知道必须替换哪个列,然后需要一个新值列表。

你可以试试:

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


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

Hmm不确定这是否有效。您可以尝试使用替换功能: 此函数需要知道必须替换哪个列,然后需要一个新值列表。

你可以试试:

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


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

我相信,有一种更简单的方法可以做到这一点,但我可以通过将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'])

我确信,有一种更简单的方法可以做到这一点,但我能够通过将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'])

你可以试着用这种方法。我得到了想要的结果。对不起,我昨天给了你不好的建议。希望它现在起作用了。(我昨天错了,它需要一本字典,而不是一份清单)


你可以试着用这种方法。我得到了想要的结果。对不起,我昨天给了你不好的建议。希望它现在起作用了。(我昨天错了,它需要一本字典,而不是一份清单)


我尝试过这种方法,它只是打印df1,因为它没有做任何更改,也没有任何错误displayed@pybeginner对不起,我累了。我发布了一个新的答案,我自己尝试了这个代码。我想你也应该这样做。我很生气。它不需要一个列表,函数需要一个命令。我尝试了这个方法,它只打印df1,因为它没有做任何更改,也没有任何错误displayed@pybeginner对不起,我累了。我发布了一个新的答案,我自己尝试了这个代码。我想你也应该这样做。我很生气。它不需要列表,函数需要一个命令。