如果匹配唯一值,则尝试将每一行从df1更新为df2。如果不是,则将该行附加到df2并分配新的ID列
df1(无ID列):
unique_value Status Price
0 xyz123 bad 6.67
1 eff987 bad 1.75
2 efg125 okay 5.77
df2:
unique_value Status Price ID
0 xyz123 good 1.25 1000
1 xyz123 good 1.25 1000
2 xyz123 good 1.25 1000
3 xyz123 good 1.25 1000
4 xyz985 bad 1.31 1001
5 abc987 okay 4.56 1002
6 eff987 good 9.85 1003
7 asd541 excellent 8.85 1004
更新的df2的期望输出:
unique_value Status Price ID
0 xyz123 bad 6.67 1000 <-updated
1 xyz123 bad 6.67 1000 <-updated
2 xyz123 bad 6.67 1000 <-updated
3 xyz123 bad 6.67 1000 <-updated
4 xyz985 bad 1.31 1001
5 abc987 okay 4.56 1002
6 eff987 bad 1.75 1003 <-updated
7 asd541 excellent 8.85 1004
8 efg125 okay 5.77 1005 <-appended
以下是我迄今为止所做的工作:
for i in range(0, len(df1)):
if df1['unique_value'].isin(df2['unique_value'])[i] == True:
... update row in df2
else:
df2 = df2.append(i)
... assign row with new ID using pd.factorize and ID value at df2['ID'].max()+1
注意,我最初使用pd.factorize
根据df2
的唯一_值分配ID,值从1000
、1001
(等等)开始,使用以下代码:df2['ID'] = pd.factorize(df2['unique_value'])[0] + 1000
我尝试使用这个解决方案(Updating a dataframe rows based on another dataframe rows),但是它对我的unique_value列进行了索引,这阻止了我继续迭代另一个数据集
我们可以用什么方法来编写脚本
谢谢
我实施这两部分的策略解释如下
df2
可以通过broadcasting更新,前提是df1
中的行的形状正确地重塑为(1, 3)
。{0
开始计数,可以通过直接调用df2.loc[len(df2), :] = ...
轻松追加新行,其中len(df2)
是索引列的下一个未使用的自然数。例如:this answer李>此外,在我的解决方案中还构造了两个额外的状态变量,因为我认为它们比每次搜索整个
df2
更有效。如果这不是一个问题,它们当然可以被丢弃代码:
输出:
使用python 3.7、1.1.2、OS=debian 10 64位进行测试
相关问题 更多 >
编程相关推荐