将两列合并为一个使用pandas或Excel作家保持层次结构

我需要将两列合并为一个保留层次结构,使用pandas或pandas和Excel作家。 我需要改变这一点:

df = pd.DataFrame({'A': [ 'p', 'p', 'q'], 'B': ['x', 'y', 'z'], 'C': [1, 2, 3]}) df ABC 0 px 1 1 py 2 2 qz 3 

对此:

  AC 0 p 1 x 1 2 y 2 3 q 4 z 3 

UPD。 感谢您的帮助。 我编辑我的问题,并添加更多的细节。

看来你需要:

 df1 = df.stack().drop_duplicates().reset_index(drop=True).to_frame(name='A') print (df1) A 0 p 1 x 2 y 3 q 4 z 

详情:

 print (df.stack()) 0 A p B x 1 A p B y 2 A q B z dtype: object print (df.stack().drop_duplicates()) 0 A p B x 1 B y 2 A q B z dtype: object 

或者如果需要删除重复只在第一列是可能的replace他们的NaNstack函数删除这些行:

 df = pd.DataFrame({'A': [ 'p', 'p', 'q'], 'B': ['x', 'z', 'z']}) print (df) AB 0 px 1 pz 2 qz df['A'] = df['A'].mask(df['A'].duplicated()) df = df.stack().reset_index(drop=True).to_frame(name='A') print (df) A 0 p 1 x 2 z 3 q 4 z 

详情:

 df['A'] = df['A'].mask(df['A'].duplicated()) print (df) AB 0 px 1 NaN y 2 qz 

编辑:

 df1 = (df.set_index('C') .stack() .reset_index(name='A') .drop('level_1', 1) .drop_duplicates('A')[['A','C']]) df1['C'] = df1['C'].mask(df1['A'].isin(df['A']), '') print (df1) AC 0 p 1 x 1 3 y 2 4 q 5 z 3 

如上所述使用stack

或者,

 In [5443]: _, idx = np.unique(df, return_index=True) In [5444]: pd.DataFrame({'A': df.values.flatten()[np.sort(idx)]}) Out[5444]: A 0 p 1 x 2 y 3 q 4 z