如何以XOR方式合并/加入/组合2个系列,同时保持冲突的值

时间:2017-08-22 16:12:01

标签: python pandas dataframe merge xor

我有以下数据框,其中''被视为空:

df = pd.DataFrame({1: ['a', 'b', 'c']+ ['']*2, 2: ['']*2+ ['d','e', 'f']})
   1  2
0  a  '' 
1  b  '' 
2  c  d
3  '' e
4  '' f

如何合并/加入/组合(我不知道正确的术语)col2到col1,以便我有:

   1  2
0  a ''  
1  b ''  
2  c  d
3  e '' 
4  f '' 

或者如果我决定将col1合并到col2:

   1  2
0 ''  a
1 ''  b
2  c  d
3 ''  e
4 ''  f

我希望能够决定合并哪个col,另一个col应该包含冲突值。 提前谢谢

4 个答案:

答案 0 :(得分:1)

您可以使用数据框方法apply()执行此操作:

示例数据:

df
   1  2
0  a   
1  b   
2  c  d
3     e
4     f

定义任意变量:

merge_to_column = 2
other_column = 1

使用apply:

df['output'] = df.apply(lambda x: x[other_column] if x[merge_to_column] == '' else x[merge_to_column], axis=1)

输出:

df
  1  2 output
0  a         a
1  b         b
2  c  d      d
3     e      e
4     f      f

答案 1 :(得分:1)

您可以使用.fillna():

df[1] = df[1].fillna(df[2])

然后你从df [2]中取出碰撞的值:

df[2] = [None if r[1] == r[2] else r[2] for _, r in df.iterrows()]

输出:

        1   2
   0    a   None
   1    b   None
   2    c   d
   3    e   None
   4    f   None

请注意,不要使用''对于空值,在这种情况下必须使用None:

df = pd.DataFrame({1: ['a', 'b', 'c']+[None]*2, 2: [None]*2+['d','e', 'f']})

答案 2 :(得分:1)

您还可以将combine_first方法用于矢量化(和更简单)版本:

df[1].replace('', np.nan).combine_first(df[2])

结果:

0    a
1    b
2    c
3    e
4    f

你也可以同时获得两个栏目:

df.replace('', np.nan).combine_first(df.rename(columns={1: 2, 2: 1}))

结果:

   1  2
0  a  a
1  b  b
2  c  d
3  e  e
4  f  f

答案 3 :(得分:0)

def merge(col1, col2):
    for x in range(len(col1)):
        if col1[x] == '':
            col1[x] = col2[x]
            col2[x] = ''

此函数会将col2中的值合并到col1中,它会找到引号,假设两列的大小相同。您可以根据需要处理不同的尺寸。