Разделение по столбцам с помощью Pandas

#python #pandas #csv

#python #pandas #csv

Вопрос:

Здесь я столкнулся с реальной проблемой, которую я не могу решить.

Я беру 7 файлов .txt, удаляю первую строку из каждого (я хочу добавить свои собственные заголовки) и объединяю их в один файл .txt. Я был успешным вплоть до этой части. Часть, с которой у меня возникли проблемы, — это изменение его на csv / xlsx, который разделяется на столбцы при просмотре в Excel. Прямо сейчас он просто помещает все в одну строку.

Вот мой код на данный момент.

 path = r'C:UsersrockDesktopworkspaceDTH'          
all_files = glob.glob(path   "/*.TXT")

li = []

for filename in all_files:

    lines = open(filename).readlines()
    open(filename, 'w').writelines(lines[1:])
    df = pd.read_csv(filename, index_col=False, header=None)
    li.append(df)

frame = pd.concat(li, axis=0, ignore_index=True,) 

frame.to_csv("Test.csv", index=False)  
frame.to_excel("test2.xlsx") 

  

Я приложил пример изображенияcsv, которое я получаю с моим выводом.

Данные скопированы из .txt ниже:

 WEST                 26/10/2020 13:00:00         13:06:16       01:00:00       FRUIT            HELLO         GOODBYE                                           Done       Sub                    13:00:00          13:06:16         00:06:16                                                                                                  
WEST                 26/10/2020 19:00:00         19:00:42       00:30:00       VEGGIES             CARROT         POTATO                                         Done       Sub                    19:00:00          19:00:42         00:00:42                                                                                                  

  

Заранее спасибо за любую помощь. Очень признателен.

Комментарии:

1. Похоже, что pandas не анализирует ваши файлы как фреймы данных. Мы не знаем содержимого ваших .txt файлов, но, похоже, у них есть значения, разделенные символом t табуляции. Попробуйте добавить именованный аргумент sep='t' в свою pd.read_csv функцию. Если это не сработает, возможно, вы могли бы предоставить нам образец ваших данных в виде текста, а не в виде изображения.

2. Я пробовал sep='t' , и это не сработало. Это может быть глупый вопрос, но как мне прикрепить копию файлов .txt, с которыми я работаю?

Ответ №1:

Попробуйте это :

 path = r'C:UsersrockDesktopworkspaceDTH'          
all_files = glob.glob(path   "/*.TXT")

li = []

for filename in all_files:
    lines = open(filename).readlines()
    open(filename, 'w').writelines(lines[1:])
    df = pd.read_csv(filename, delimiter = ',', header=None)
    li.append(df)

frame = pd.concat(li, axis=0, ignore_index=True) 

frame.to_csv("Test.csv", index=None)  
frame.to_excel("test2.xlsx")
  

Таблица CSV должна иметь разделитель символов, чтобы иметь возможность разделять каждую строку.

Комментарии:

1. Я все еще получаю те же результаты при попытке выше.

Ответ №2:

Данные Excel не были разделены на столбцы (т. Е. Все данные находятся в столбце A); возможно, файл фиксированной ширины был импортирован в Excel. Вот один из подходов, использующий текстовые данные в исходном сообщении:

 from io import StringIO
import pandas as pd

data = '''
WEST                 26/10/2020 13:00:00         13:06:16       01:00:00       FRUIT            HELLO         GOODBYE                                           Done       Sub                    13:00:00          13:06:16         00:06:16                                                                                                  
WEST                 26/10/2020 19:00:00         19:00:42       00:30:00       VEGGIES             CARROT         POTATO                                         Done       Sub                    19:00:00          19:00:42         00:00:42                                                                                                  
'''

df = pd.read_csv(StringIO(data), sep='ss ', engine='python', header=None)
print(df.transpose())

                      0                    1
0                  WEST                 WEST
1   26/10/2020 13:00:00  26/10/2020 19:00:00
2              13:06:16             19:00:42
3              01:00:00             00:30:00
4                 FRUIT              VEGGIES
5                 HELLO               CARROT
6               GOODBYE               POTATO
7                  Done                 Done
8                   Sub                  Sub
9              13:00:00             19:00:00
10             13:06:16             19:00:42
11             00:06:16             00:00:42
  

Комментарии:

1. Похоже, что это фиксированная ширина из текстового файла, однако это не совсем тот результат, который я ищу. Я пытался получить его все еще в пределах его 12 столбцов

2. У меня есть двенадцать столбцов — мои результаты просто транспонированы, поэтому они подходят без переноса.

3.Похоже, это не работает с фреймом данных, я попробовал: frame = pd.concat(li, axis=0, ignore_index=True) cf = pd.read_csv(StringIO(frame), sep='ss ', engine='python', header=None) и получил ошибку TypeError: initial_value must be str or None, not DataFrame

4. На самом деле вам просто нужно добавить sep=ss , engine='python' в свой pd.read_csv

Ответ №3:

Я смог решить эту проблему, выполнив следующее:

 column_headers = [list of header names]
               
df = pd.read_table(filename,sep=r"[ ]{2,}", header=None, skiprows=1, engine='python', names=column_headers)

  

Спасибо тем, кто представил несколько возможных решений, чтобы попробовать