แปลงแถวเป็นส่วนหัวของคอลัมน์สำหรับ Pandas DataFrame


112

ข้อมูลที่ฉันต้องจัดการมันค่อนข้างยุ่ง .. มันมีชื่อส่วนหัวอยู่ในข้อมูล ฉันจะเลือกแถวจากดาต้าเฟรมของแพนด้าที่มีอยู่แล้วทำให้ (เปลี่ยนชื่อเป็น) เป็นส่วนหัวคอลัมน์ได้อย่างไร

ฉันต้องการทำสิ่งที่ชอบ:

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

df.columns = header

คำตอบ:


197
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

ตั้งค่าป้ายชื่อคอลัมน์ให้เท่ากับค่าในแถวที่ 2 (ตำแหน่งดัชนี 1):

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

หากดัชนีมีป้ายกำกับที่ไม่ซ้ำกันคุณสามารถวางแถวที่ 2 โดยใช้:

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

หากดัชนีไม่ซ้ำกันคุณสามารถใช้:

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

การใช้df.drop(df.index[1])จะลบแถวทั้งหมดที่มีป้ายกำกับเดียวกันกับแถวที่สอง เนื่องจากดัชนีที่ไม่ซ้ำกันอาจทำให้เกิดการสะดุด (หรือจุดบกพร่องที่อาจเกิดขึ้น) เช่นนี้จึงมักจะดีกว่าที่จะดูแลให้ดัชนีไม่ซ้ำกัน (แม้ว่า Pandas จะไม่ต้องการก็ตาม)


ขอบคุณมากสำหรับการตอบกลับอย่างรวดเร็ว! ฉันจะเลือกแถวตามค่าแทนตำแหน่งดัชนีเพื่อสร้างส่วนหัวได้อย่างไร ตัวอย่างเช่น .. df.columns = df [df [0] == 'foo']
EK

"foo"ปัญหาที่เป็นอาจจะมีมากกว่าหนึ่งแถวซึ่งมีค่า df.columns = df.iloc[np.where(df[0] == 'foo')[0][0]]วิธีหนึ่งในการแก้ไขปัญหาที่เป็นไปอย่างชัดเจนเลือกแถวดังกล่าวครั้งแรก:
unutbu

ฉันเข้าใจแล้วว่าทำไมคุณถึงทำแบบนั้น สำหรับกรณีของฉันฉันรู้ว่ามีเพียงแถวเดียวที่มีค่า "foo" ดังนั้นมันก็โอเค ฉันเพิ่งทำแบบนี้ฉันเดาว่ามันเหมือนกับที่คุณให้ไว้ข้างต้น idx_loc = df [df [0] == 'foo']. index.tolist () [0] df.columns = df.iloc [idx_loc]
EK

64

สิ่งนี้ใช้ได้ (แพนด้า v'0.19.2 '):

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

23
คุณสามารถลบแถว "ส่วนหัว" ได้โดยเพิ่ม.drop(df.index[0])
ostrokach

ฉันชอบสิ่งนี้ดีกว่าคำตอบที่ยอมรับจริง ฉันชอบโซลูชันออนไลน์สั้น ๆ
Javier

14

การสร้างกรอบข้อมูลใหม่จะง่ายกว่า นอกจากนี้ยังจะตีความประเภทคอลัมน์ตั้งแต่เริ่มต้น

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

4

คุณสามารถระบุดัชนีแถวในread_csvหรือread_htmlก่อสร้างผ่านพารามิเตอร์ซึ่งหมายถึงheader Row number(s) to use as the column names, and the start of the dataสิ่งนี้มีข้อดีในการวางแถวก่อนหน้าทั้งหมดซึ่งคาดว่าจะเป็นขยะโดยอัตโนมัติ

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

0

ในการเปลี่ยนชื่อส่วนหัวโดยไม่ต้องกำหนด df ใหม่:

df.rename(columns=df.iloc[0], inplace = True)

ในการวางแถวโดยไม่กำหนด df ใหม่:

df.drop(df.index[0], inplace = True)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.