pandas OrderedDict полоса для чтения read_excel - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть файл Excel с более чем 100 листами.Мне нужно импортировать в панды и создать датафрейм.Проблема в том, что заголовки некоторых столбцов содержат пробелы, поэтому я получаю фрейм данных с несколькими дублирующимися столбцами.

Можно ли зарезать пробел в столбцах в OrderedDict?Я знаю, что могу использовать str.strip() в кадре данных, но не могу найти ничего для OrderedDict.

У меня есть следующая структура в Excel:

sheet TEST:
   'ID1' 'ID2'  'ID3'  'ID4'
1   A     2016   val    val 
2   B     2017   val    val
3   C     2018   val    val

sheet TEST2:
   'ID1' 'ID2'  'ID3 ' 'ID4'
1   A     2016   val    val 
2   B     2017   val    val
3   C     2018   val    val

sheet TEST3:
   'ID1' 'ID2'  'ID3' 'ID4 '
1   A     2016   val    val 
2   B     2017   val    val
3   C     2018   val    val

На данный момент я делаю следующее:

df = pd.read_excel (File location, sheet_name = ['TEST', 'TEST2', 'TEST3'])

df = pd.concat(df, axis=0, sort=False)
df = df.reset_index()

Вот что я получаю:

   'ID1'  'ID2'  'ID3'  'ID4' 'ID3 ' 'ID4 '
1   A     2016    val    val   NaN    NaN
2   B     2017    val    val   NaN    NaN
3   C     2018    val    val   NaN    NaN
4   A     2016    NaN    val   val    NaN
5   B     2017    NaN    val   val    NaN
6   C     2018    NaN    val   val    NaN
7   A     2016    val    NaN   NaN    val
8   B     2017    val    NaN   NaN    val
9   C     2018    val    NaN   NaN    val

Вот что мне нужно:

   'ID1'  'ID2'  'ID3'  'ID4' 
1   A     2016    val    val   
2   B     2017    val    val   
3   C     2018    val    val   
4   A     2016    val    val   
5   B     2017    val    val   
6   C     2018    val    val   
7   A     2016    val    val   
8   B     2017    val    val   
9   C     2018    val    val   

Большое спасибо

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Если вы читаете на нескольких листах, а ваша книга большая, то более эффективно , чтобы использовать pd.ExcelFile для создания ExcelFile объекта, а затем обращаться к листам по отдельности.Это также делает форматирование имени столбца очень простым:

import pandas as pd

xls = pd.ExcelFile(filepath)

dfs = []
for sheet in xls.sheet_names:
    df = pd.read_excel(xls, sheet)
    df.columns = df.columns.str.strip()
    dfs.append(df)

df = pd.concat(dfs)
0 голосов
/ 19 сентября 2019

Просто определите разделение, чтобы упростить его:

df1 = pd.read_excel (File location TEST, sheet_name = 'TEST')
df2 = pd.read_excel (File location TEST2, sheet_name = 'TEST2')
df3 = pd.read_excel (File location TEST3, sheet_name = 'TEST3')

, а затем просто объедините его так:

df = pd.concat([df1,df2,df3], axis=0)
df = df.reset_index()

Надеюсь, это поможет:)

РЕДАКТИРОВАТЬ: Если вы хотите применить его с помощью цикла, просто сделайте следующее: при условии, что у вас есть 150 листов, и имя вашего листа итеративно, как "TEST" "TEST2" "TEST3" .. "TEST150"

listdf = []
name=""
for x in range(150):
    if x==0: name = "TEST"
    elif x>0: name= "TEST" + str(x+1)
    df = pd.read_excel (File location TEST, sheet_name = name)
    listdf.append(df)

newbigdf = pd.concat(listdf, axis=0)
...