2017-08-22 72 views
0

我有以下的數據幀,其中「」會被視爲空:如何合併/加盟/在XOR方式組合2系列,同時保持相互衝突的價值

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 

我希望能夠在其中決定山坳合併和其他山坳應包含衝突值。 預先感謝您

回答

1

你可以做到這一點使用數據幀的方法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 
0
def merge(col1, col2): 
    for x in range(len(col1)): 
     if col1[x] == '': 
      col1[x] = col2[x] 
      col2[x] = '' 

在那裏找到引號,此功能將合併來自COL2值到COL1,假設兩列大小相同。您可以根據需要處理不同的尺寸。

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 

注意空而不是使用「」值,你必須在這種情況下使用無:

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

您還可以使用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