将两列合并为一个使用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他们的NaN
和stack
函数删除这些行:
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