2016-08-10 32 views
6

Bir veri çerçevesinin çeşitli sütun gruplarını birden fazla hedef sütuna eritmek istiyorum. Python Pandas Melt Groups of Initial Columns Into Multiple Target Columns ve pandas dataframe reshaping/stacking of multiple value variables into seperate columns sorularına benzer. Ancak bunu açıkça, dizin konumu yerine sütun adıyla yapmam gerekiyor.Pandalar Birden çok hedef sütunu sütunlara birden çok hedef sütuna dönüştürün

import pandas as pd 
df = pd.DataFrame([('a','b','c',1,2,3,'aa','bb','cc'), ('d', 'e', 'f', 4, 5, 6, 'dd', 'ee', 'ff')], 
        columns=['a_1', 'a_2', 'a_3','b_1', 'b_2', 'b_3','c_1', 'c_2', 'c_3']) 
df 

Orjinal Dataframe:

id a_1 a_2 a_3 b_1 b_2 b_3 c_1 c_2 c_3 
0 101 a b c 1 2 3 aa bb cc 
1 102 d e f 4 5 6 dd ee ff 

Hedef Dataframe

 id a b c 
0 101 a 1 aa 
1 101 b 2 bb 
2 101 c 3 cc 
3 102 d 4 dd 
4 102 e 5 ee 
5 102 f 6 ff 

Önerileri kadar buna bir yaklaşım takdir edilmektedir.

Sen sütunlar desen dayalı çoklu endekse sütun adları dönüştürmek ve daha sonra ihtiyacınız sonucuna göre belli bir seviyede yığabilirsiniz
+0

Bu durum için tam olarak oluşturulan pd.wide_to_long işlevini kullanan daha sezgisel bir çözüm var. Cevabımı aşağıya bakın. –

cevap

8

:

import pandas as pd 
df.set_index('id', inplace=True) 
df.columns = pd.MultiIndex.from_tuples(tuple(df.columns.str.split("_"))) 
df.stack(level = 1).reset_index(level = 1, drop = True).reset_index() 

# id a b c  
#101 a 1 aa 
#101 b 2 bb 
#101 c 3 cc 
#102 d 4 dd 
#102 e 5 ee 
#102 f 6 ff 
+1

'df.columns = df.columns.str.split ('_', genişlet = Doğru)' ayrıca çalışır – Happy001

2
cols = df.columns.difference(['id']) 

pd.lreshape(df, cols.groupby(cols.str.split('_').str[0])).sort_values('id') 
Out: 
    id a c b 
0 101 a aa 1 
2 101 b bb 2 
4 101 c cc 3 
1 102 d dd 4 
3 102 e ee 5 
5 102 f ff 6 
+0

Neden bu açıklar? Cols.groupby (cols.str.split ('_'). Str [0]) "bir dict döndürür? – Merlin

+0

[Index.groupby] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.groupby.html) bir dict döndürür. Muhtemelen endekste aritmetik yapmak yaygın bir kullanım durumu olmadığı için genellikle gruplara ihtiyacımız var. – ayhan

+0

Beklenmedik bir davranıştı, bu yüzden soruyorum. – Merlin

2

yapmak için daha etkili bir yol yoktur Birden çok farklı sütun kümesini eritmeyi içeren bu tür sorunlar. pd.wide_to_long, bu tam durumlar için üretilmiştir.

pd.wide_to_long(df, stubnames=['a', 'b', 'c'], i='id', j='dropme', sep='_')\ 
    .reset_index()\ 
    .drop('dropme', axis=1)\ 
    .sort_values('id') 

    id a b c 
0 101 a 1 aa 
2 101 b 2 bb 
4 101 c 3 cc 
1 102 d 4 dd 
3 102 e 5 ee 
5 102 f 6 ff 
İlgili konular