2014-02-05 41 views
12

如何強制合併或加入後綴。我知道有可能提供一個,如果有碰撞,但在我的情況下,我正在合併df1與df2,這不會導致任何碰撞,但然後在使用後綴的df2上再次合併,但我希望每個合併都有一個後綴,因爲如果我按照您的想象做不同的組合,會變得混亂。熊貓加入DataFrame強制後綴?

+0

爲什麼不只是將df1和df2連接在一起,而是重命名df2中的衝突列,以便您可以確定原始數據的來源? – EdChum

回答

15

你可能會迫使後綴實際數據框:

In [11]: df_a = pd.DataFrame([[1], [2]], columns=['A']) 

In [12]: df_b = pd.DataFrame([[3], [4]], columns=['B']) 

In [13]: df_a.join(df_b) 
Out[13]: 
    A B 
0 1 3 
1 2 4 

通過追加到它的列的名稱:

In [14]: df_a.columns = df_a.columns.map(lambda x: str(x) + '_a') 

In [15]: df_a 
Out[15]: 
    A_a 
0 1 
1 2 

現在加入將不需要後綴修正,他們是否碰撞與否:

In [16]: df_b.columns = df_b.columns.map(lambda x: str(x) + '_b') 

In [17]: df_a.join(df_b) 
Out[17]: 
    A_a B_b 
0 1 3 
1 2 4 
+0

我正在這樣做。我想最後,保存這個步驟併爲連接/合併功能提供一個後綴是很好的。我會將此標記爲正確的答案。謝謝。 – stgtscc

+0

而不是使用'lambda',如果它們都是字符串,你可以添加到列索引 - 'df_a.columns + =「_a」'。或者添加'df_a.columns.astype(「str」)+「_a」'如果不是。 – DSM

+0

@DSM會這樣修改col的名字嗎?我的目標是不要在現場修改它們,而只是臨時修改它們。 – stgtscc

0

熊貓合併將給新的列後綴,當已經有一列後綴相同的名稱,當我需要用後綴強制新列時,我創建一個空列與我想要加入的列的名稱。

df["colName"] = "" #create empty column 
df.merge(right = "df1", suffixes = ("_a","_b")) 

您可以稍後刪除空列。

你可以爲多個列做同樣的,或在df.columns.values每列

0

這是我一直使用到pandas.merge 2 DataFrames和部隊後面添加什麼:

def merge_force_suffix(left, right, **kwargs): 
    on_col = kwargs['on'] 
    suffix_tupple = kwargs['suffixes'] 

    def suffix_col(col, suffix): 
     if col != on_col: 
      return str(col) + suffix 
     else: 
      return col 

    left_suffixed = left.rename(columns=lambda x: suffix_col(x, suffix_tupple[0])) 
    right_suffixed = right.rename(columns=lambda x: suffix_col(x, suffix_tupple[1])) 
    del kwargs['suffixes'] 
    return pd.merge(left_suffixed, right_suffixed, **kwargs)