Изменить начальный заголовок столбца и прочитать следующую строку при чтении нескольких файлов - PullRequest
0 голосов
/ 24 октября 2019

Мне нужно, чтобы строка 'name' была начальным заголовком столбца для всех файлов. После того, как заголовок столбца сделан, я хочу, чтобы данные начинались после него.

У меня есть 3 файла (+ больше), и столбцы имеют другой индекс:

    2        3      4      5      6       7     ...    
0    A        B     nan    nan    nan     nan    ...     
1    Nan      B     nan    nan     C      nan    ...     
2    Nan      B     nan    nan     C      nan    ...     
3    AA       B     nan    nan     C      nan    ...     
4    Name  Address  Type   Size   Comment Grade  ...     Brand
5    John    ggg    sports  8     Nil      A     ....    Nike
6    John    ggg    sports  9     Nil      B     ....    Nike
7    Mary    ggg    sports  6     Nil      A     ....    Adidas

     2        3      4      5      6       7     ...    
0    A        B     nan    nan    nan     nan    ...     
1    Nan      B     nan    nan     C      nan    ...      
2    Name  Address  Type   Size   Comment Grade  ...     Brand
3    Jack    aaa    sports  10     Nil      A     ....    Nike
4    Jack    aaa    sports  10    Nil      B     ....    Nike
5    May     aaa    sports  6     Nil      A     ....    Adidas

     2        3      4      5      6       7     ...    
0    A        B     nan    nan    nan     nan    ...     
1    Nan      B     nan    nan     C      nan    ...     
2    Nan      B     nan    nan     C      nan    ...      
3    Name  Address  Type   Size   Comment Grade  ...     Brand
4    Gary    ddd    sports  10     Nil      A     ....    Nike
5    Gary    ddd    sports  10     Nil      B     ....    Nike
6    Gary    ddd    sports  10     Nil      A     ....    Adidas

Я думал об этом: (Ошибка)

1. a = df.columns.str.startswith('Name')
   df.columns = a
2. a = df.loc['Name']
   df.columns = a

Я хотел бы поместить код здесь: (Забыл включить это, извините !!!)

for file in files:
    df = pd.read_csv(file, header=0)
    <Codes to change starting column header>

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Вы можете использовать это

loc = df['2'].str.contains('Name').idxmax() # We find the row which has the string 'Name' in column '2'
cols = df.iloc[loc].tolist() #we get the contents of that row to use later as column names
df1 = df.iloc[loc+1:,] #we filter the dataframe to get rows after the row with 'Name'
df1.columns= cols #rename columns
print(df1)

Вход

2   3   4   5   6   7   ...     Brand
0   A   B   NaN     NaN     NaN     NaN     ...     nike
1   Nan     B   NaN     NaN     C   NaN     ...     nike
2   Nan     B   NaN     NaN     C   NaN     ...     nike
3   AA  B   NaN     NaN     C   NaN     ...     Adidas
4   Name    Address     Type    Size    Comment     Grade   ...     Adidas
5   John    ggg     sports  8   Nil     A   ....    Adidas

Выход

Name    Address     Type    Size    Comment     Grade   ...     Adidas
5   John    ggg     sports  8   Nil     A   ....    Adidas

вы for цикл может быть как показано ниже

for file in files:
    df = pd.read_csv(file, header=0)
    loc = df['2'].str.contains('Name').idxmax() # We find the row which has the string 'Name' in column '2'
    cols = df.iloc[loc].tolist() #we get the contents of that row to use later as column names
    df1 = df.iloc[loc+1:,] #we filter the dataframe to get rows after the row with 'Name'
    df.append(df1)

После того, как вы вышли из цикла for, вы можете сделать df.columns= cols

0 голосов
/ 24 октября 2019

В этой строке:

a = df.columns.str.startswith('Name')

df.columns будет [2, 3, 4, 5, 6, 7], потому что это имена ваших столбцов. так что это неправильно. В настоящее время Имя не находится в заголовках столбцов, это просто значение в столбце с именем '2', вместо этого вы можете сделать:

a = df[df['2'].str.startswith('Name', na=False)] 
df.columns = a.tolist()
#you should be sure you only have exactly 1 occurrence of 'Name'

после установки столбцов с помощьюжелаемые имена, вы должны удалить строку с такими именами, как это:

df = df.drop(df['2'].str.startswith('Name', na=False).index)

Так что вам нужно запустить начинается с в столбце с именем «2» (который создает логическую маску) вВаш код 2. у вас похожая проблема, .loc используется для выбора данных на основе меток, но в настоящее время «Имя» не является меткой столбца или индекса, это просто значение.

Это может быть полезно, если вычитайте о столбцах и индексах на пандах и используя условные выражения для создания логических масок, их много, я нашел одну хорошую ссылку: основы панд

...