如何在保持冲突值的同时以异或方式 merge/join/combine 2 系列
How to merge/join/combine 2 series in XOR manner while keeping conflicting values
我有以下数据框,其中 '' 被认为是空的:
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
我怎样才能 merge/join/combine(我不知道正确的术语)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
我希望能够决定在哪个列中合并,而另一个列应包含冲突值。
提前谢谢你
def merge(col1, col2):
for x in range(len(col1)):
if col1[x] == '':
col1[x] = col2[x]
col2[x] = ''
此函数会将 col2 中的值合并到 col1 中,并在其中找到引号,假设两列的大小相同。您可以根据需要处理不同的尺寸。
您可以使用数据框方法apply()
:
示例数据:
df
1 2
0 a
1 b
2 c d
3 e
4 f
定义任意变量:
merge_to_column = 2
other_column = 1
使用申请:
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
您可以使用.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']})
您还可以将 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
我有以下数据框,其中 '' 被认为是空的:
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
我怎样才能 merge/join/combine(我不知道正确的术语)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
我希望能够决定在哪个列中合并,而另一个列应包含冲突值。 提前谢谢你
def merge(col1, col2):
for x in range(len(col1)):
if col1[x] == '':
col1[x] = col2[x]
col2[x] = ''
此函数会将 col2 中的值合并到 col1 中,并在其中找到引号,假设两列的大小相同。您可以根据需要处理不同的尺寸。
您可以使用数据框方法apply()
:
示例数据:
df
1 2
0 a
1 b
2 c d
3 e
4 f
定义任意变量:
merge_to_column = 2
other_column = 1
使用申请:
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
您可以使用.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']})
您还可以将 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