Python:如何从一个数据帧替换另一个数据帧中的列值而不删除重复项
我有两个数据帧:一个来自csv文件,另一个来自sql db的输出 DataFrame1如下所示:(源自csv文件)df1Python:如何从一个数据帧替换另一个数据帧中的列值而不删除重复项,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
|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对不起,我累了。我发布了一个新的答案,我自己尝试了这个代码。我想你也应该这样做。我很生气。它不需要列表,函数需要一个命令。