sourcetip

머리글을 맨 위 행으로 바꾸기

fileupload 2023. 6. 17. 09:36
반응형

머리글을 맨 위 행으로 바꾸기

현재 다음과 같은 데이터 프레임이 있습니다.

       Unnamed: 1    Unnamed: 2   Unnamed: 3  Unnamed: 4
0   Sample Number  Group Number  Sample Name  Group Name
1             1.0           1.0          s_1         g_1
2             2.0           1.0          s_2         g_1
3             3.0           1.0          s_3         g_1
4             4.0           2.0          s_4         g_2

헤더 행을 삭제하고 첫 번째 행을 새 헤더 행으로 만들어 새 데이터 프레임을 다음과 같이 만드는 방법을 찾고 있습니다.

    Sample Number  Group Number  Sample Name  Group Name
0             1.0           1.0          s_1         g_1
1             2.0           1.0          s_2         g_1
2             3.0           1.0          s_3         g_1
3             4.0           2.0          s_4         g_2

저는 다음과 같은 것들을 시도해 보았습니다.if 'Unnamed' in df.columns:그런 다음 헤더 없이 데이터 프레임을 만듭니다.

df.to_csv(newformat, header=False, index=False)

하지만 진전이 없는 것 같아요

new_header = df.iloc[0] #grab the first row for the header
df = df[1:] #take the data less the header row
df.columns = new_header #set the header row as the df header

데이터 프레임은 다음 작업을 수행하여 변경할 수 있습니다.

df.columns = df.iloc[0]
df = df[1:]

그리고나서

df.to_csv(path, index=False) 

요령을 터득해야 합니다.

원라이너를 원하는 경우 다음을 수행할 수 있습니다.

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

파이썬 스와핑을 사용하는 또 다른 원라이너:

df, df.columns = df[1:] , df.iloc[0]

인덱스를 재설정하지 않습니다.

하지만 그 반대는 예상대로 되지 않을 것입니다.df.columns, df = df.iloc[0], df[1:]

@ostrokach 답변이 가장 좋습니다.대부분의 경우 데이터 프레임에 대한 참조를 통해 데이터 프레임을 유지하기를 원하기 때문에 = True의 이점을 얻을 수 있습니다.
df.rename(columns=df.iloc[0], inplace = True) df.drop([0], inplace = True)

열 인덱스를 "제자리"로 정의하는 간단한 트릭이 있습니다.왜냐면set_index행 인덱스를 설정합니다. 데이터 프레임을 전환하고 인덱스를 설정한 다음 다시 전환하여 열에 대해 동일한 작업을 수행할 수 있습니다.

df = df.T.set_index(0).T

다음을 변경해야 할 수도 있습니다.0set_index(0)행에 이미 다른 인덱스가 있는 경우.

대신에, 우리는 판다와 함께 파일을 읽을 때 이것을 할 수 있습니다.

우리가 사용할 수 있는 이 사건은

pd.read_csv('file_path',skiprows=1)

파일을 읽을 때 첫 번째 행을 건너뛰고 열을 파일의 두 번째 행으로 설정합니다.

어떤 이유에서인지, 저는 이렇게 해야만 했습니다.

df.columns = [*df.iloc[0]]
df = table[1:]

목록을 목록으로 분할하는 부분은 중복된 것처럼 보이지만 그렇지 않으면 헤더는 여전히 실제 테이블의 일부로 나타납니다.

--이것을 하는 다른 방법.


df.columns = df.iloc[0]
df = df.reindex(df.index.drop(0)).reset_index(drop=True)
df.columns.name = None

    Sample Number  Group Number  Sample Name  Group Name
0             1.0           1.0          s_1         g_1
1             2.0           1.0          s_2         g_1
2             3.0           1.0          s_3         g_1
3             4.0           2.0          s_4         g_2

괜찮으시다면 화살을 쏘세요.감사해요.

header = table_df.iloc[0]
table_df.drop([0], axis =0, inplace=True)
table_df.reset_index(drop=True)
table_df.columns = header
table_df

이 작업은 두 번 이상 필요할 수 있습니다.저는 rgalbo의 답변을 받아 어떤 프로젝트에도 들어올려 넣을 수 있는 간단한 기능을 작성했습니다.

def promote_df_headers(df):
    '''
    Takes a df and uses the first row as the header

    Parameters
    ----------
    df : DataFrame
        Any df with one or more columns.

    Returns
    -------
    df : DataFrame
        Input df with the first row removed and used as the column names.

    '''

    new_header = df.iloc[0] 
    df = df[1:] 
    df.columns = new_header
    df = df.reset_index(drop=True)

    return df

모범 사례 및 베스트 원 라이너:

df.to_csv(newformat,header=1)

헤더 값을 확인합니다.

헤더는 열 이름으로 사용할 행 번호를 참조합니다.행 번호는 df가 아니라 excel 파일(0은 첫 번째 행, 1은 두 번째 행 등)입니다.

이렇게 하면 원하는 열 이름을 얻을 수 있으며 추가 코드를 작성하거나 새 df를 작성할 필요가 없습니다.

좋은 점은, 교체된 행을 삭제한다는 것입니다.

언급URL : https://stackoverflow.com/questions/31328861/replacing-header-with-top-row

반응형