2017-10-24 9 views
1

pandasまたはpandasとexcel writerのどちらかを使用して、2つの列を1つの階層構造に保持する必要があります。pandasまたはexcel writerを使用して2つの列を1つの階層構造にまとめる

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

UPD:これに

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 

:私はこれを変換する必要があります。 ありがとうございます。質問を編集して詳細を追加しました。

+0

は、編集した私の答えを確認してください。列Aを持つデータフレームの場合は、 – jezrael

答えて

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 

EDIT:

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

'df.stack()。drop_duplicates()。reset_index(drop = True).to_frame(name = 'A')' – Zero

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 
関連する問題