[英]Upsert function in Dataframe - Python
我正在尝试相对于第一列用另一个数据框更新一个数据框。 如果第二个数据帧中有多余的行,则应将其插入第一个数据帧中。 如果第一列中有一行数据相同,而其他列中数据不同,则应更新该行。 另外,应该删除第一列中没有值的行。
使用的代码-
df = df_1.combine_first(df_2)\
.reset_index()\
.reindex(columns=df_1.columns)
df = df.drop_duplicates(subset='A', keep= 'last', inplace=False)
df.dropna(subset=['A'])
print ("Final Data")
print (df)
第一个数据框-
A B C
0 45 a b
1 98 c d
2 67 bn k
第二个数据框-
A B C
0 45 a d
1 98 c d
2 67 bn k
3 90 x z
4
最终应该看起来像-
A B C
0 45 a d
1 98 c d
2 67 bn k
3 90 x z
我得到的最终数据帧-
A B C
0 45.0 a b
1 98.0 c d
2 67.0 bn k
3 90.0 x z
4
因此,既不会更新数据,也不会删除具有空值的行。 我想念什么?
根据我对您问题的理解,如果索引匹配,则第二个数据框基本上会取代第一个数据框。 如果没有,则将差异添加到第一个数据帧。 我还假设第一列A中没有重复的键。
对此要求的定义稍有不同,最终输出应包含第二个数据帧中的所有行以及值(因为如果存在匹配项,则它们将覆盖第一个数据帧)。 因此,我们将按原样使用第二个数据帧,然后重新添加第一个数据帧中的行,而不添加第二个数据帧中的行。 请参见下面的示例。 (我也在使用略有不同的第一个数据框来突出显示效果)
import pandas as pd
df1 = pd.DataFrame({'A':[45,98,67,91],'B':['a','c','bn','y'],'C':['b','d','k','oo']})
df2 = pd.DataFrame({'A':[45,98,67,90,''],'B':['a','c','bn','x',''],'C':['d','d','k','z','']})
# Remove rows with empty values in first column. This should be whatever conditions applicable to you i.e. checking for np.nan instead of str('')
df2 = df2.loc[df2['A'] != '']
df1.set_index('A', inplace=True)
df2.set_index('A', inplace=True)
# Find keys in dataframe 1 that are not in dataframe 2
idx_diff = df1.index.difference(df2.index)
# Append these rows to dataframe 2
df_ins = df1.loc[idx_diff]
df3 = df2.append(df_ins)
df3.reset_index(inplace=True)
>>>df3
A B C
0 45 a d
1 98 c d
2 67 bn k
3 90 x z
4 91 y oo
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.