使用pandas或excel writer将两列合并为一个保持层次结构

时间:2017-10-24 10:30:24

标签: excel pandas

我需要使用pandas或pandas和excel writer将两列折叠成一个保留其余的层次结构。我需要改变这个:

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

    A   B   C
0   p   x   1
1   p   y   2
2   q   z   3

对此:

    A   C
0   p   
1   x   1
2   y   2
3   q   
4   z   3

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

2 个答案:

答案 0 :(得分:0)

似乎你需要:

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

或者,如果只需要在第一列中删除重复项,则可以通过NaN替换它们并stack函数删除此行:

df = pd.DataFrame({'A': [ 'p', 'p', 'q'], 'B': ['x', 'z', 'z']})
print (df)
   A  B
0  p  x
1  p  z
2  q  z

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)
     A  B
0    p  x
1  NaN  y
2    q  z

编辑:

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)
   A  C
0  p   
1  x  1
3  y  2
4  q   
5  z  3

答案 1 :(得分:0)

如上所述使用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