Pandas DataFrame için satırı sütun başlığına dönüştürün,


111

Çalışmam gereken veriler biraz dağınık .. Verilerinin içinde başlık adları var. Var olan bir pandas veri çerçevesinden bir satırı nasıl seçebilirim ve bunu bir sütun başlığı yapabilirim (adını değiştirebilirim)?

Şunun gibi bir şey yapmak istiyorum:

header = df[df['old_header_name1'] == 'new_header_name1']

df.columns = header

Yanıtlar:


196
In [21]: df = pd.DataFrame([(1,2,3), ('foo','bar','baz'), (4,5,6)])

In [22]: df
Out[22]: 
     0    1    2
0    1    2    3
1  foo  bar  baz
2    4    5    6

Sütun etiketlerini 2. satırdaki değerlere eşit olacak şekilde ayarlayın (dizin konumu 1):

In [23]: df.columns = df.iloc[1]

Dizinin benzersiz etiketleri varsa, 2. satırı şu şekilde bırakabilirsiniz:

In [24]: df.drop(df.index[1])
Out[24]: 
1 foo bar baz
0   1   2   3
2   4   5   6

Dizin benzersiz değilse şunları kullanabilirsiniz:

In [133]: df.iloc[pd.RangeIndex(len(df)).drop(1)]
Out[133]: 
1 foo bar baz
0   1   2   3
2   4   5   6

Kullanmak , ikinci satırla aynı etikete sahip tüm satırları df.drop(df.index[1])kaldırır . Benzersiz olmayan dizinler bunun gibi tökezleyen bloklara (veya olası hatalara) yol açabileceğinden, dizinin benzersiz olmasına dikkat etmek genellikle daha iyidir (Pandalar gerektirmese bile).


Hızlı yanıtınız için çok teşekkürler! Başlık yapmak için dizin konumu yerine değere göre bir satırı nasıl seçebilirim? Öyleyse örneğiniz için şöyle bir şey .. df.columns = df [df [0] == 'foo']
EK

Bununla ilgili sorun, değere sahip birden fazla satır olabilir "foo". Bu sorunu gidermek bir yolu açıkça bu tür ilk satırı seçmektir: df.columns = df.iloc[np.where(df[0] == 'foo')[0][0]].
unutbu

Ah, neden böyle yaptığını anladım. Benim durumum için, "foo" değerine sahip yalnızca bir satır olduğunu biliyorum. Yani sorun yok. Ben sadece bu şekilde yaptım, sanırım yukarıda bana verdiğinle aynı. idx_loc = df [df [0] == 'foo']. index.tolist () [0] df.columns = df.iloc [idx_loc]
EK

63

Bu çalışır (pandas v'0.19.2 '):

df.rename(columns=df.iloc[0])

22
"Başlık" satırını ekleyerek kaldırabilirsiniz.drop(df.index[0])
ostrokach

Bunu gerçek kabul edilen cevaptan daha çok seviyorum. Kısa çevrimiçi çözümleri seviyorum.
Javier

13

Veri çerçevesini yeniden oluşturmak daha kolay olacaktır. Bu, sütun türlerini de sıfırdan yorumlayacaktır.

headers = df.iloc[0]
new_df  = pd.DataFrame(df.values[1:], columns=headers)

4

Read_csv veya read_html yapıcılarındaki satır dizinini headertemsil eden parametre aracılığıyla belirtebilirsiniz Row number(s) to use as the column names, and the start of the data. Bunun, gereksiz olduğu varsayılan tüm önceki satırları otomatik olarak bırakma avantajı vardır.

import pandas as pd
from io import StringIO

In[1]
    csv = '''junk1, junk2, junk3, junk4, junk5
    junk1, junk2, junk3, junk4, junk5
    pears, apples, lemons, plums, other
    40, 50, 61, 72, 85
    '''

    df = pd.read_csv(StringIO(csv), header=2)
    print(df)

Out[1]
       pears   apples   lemons   plums   other
    0     40       50       61      72      85
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.