繁体   English   中英

Dataframe中的Upsert函数-Python

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM