Выберите (неиндексированный) столбец на основе текстового содержимого ячейки в кадре данных python / pandas - PullRequest
0 голосов
/ 12 февраля 2019

TL: DR - как создать фрейм данных / серию из одного или нескольких столбцов в существующем неиндексированном фрейме данных на основе столбцов, содержащих определенный фрагмент текста?

Относительно плохо знаком с Python и анализом данных и (я впервые пишу вопрос о переполнении стека, но я долго искал ответ (и использовал его для регулярного кодирования) и не имел никакого успеха.

У меня есть импорт данных из файла Excel, в котором нет именованных / проиндексированных столбцов. Я пытаюсь успешно извлечь данные из почти 2000 таких файлов, в которых все столбцы данных немного отличаются (конечно, почему?сделайте это простым ... или следуйте шаблону ... или просто используйте что-то отличное от плохо отформатированных электронных таблиц Excel ...).

Исходный кадр данных (из плохо структурированного файла XLS) выглядит примерно так:

0                                       NaN             RIGHT      NaN   
1                                      Date              UCVA      Sph   
2                       2007-01-13 00:00:00              6/38  [-2.00]   
3                       2009-11-05 00:00:00               6/9      NaN   
4                       2009-11-18 00:00:00              6/12      NaN   
5                       2009-12-14 00:00:00               6/9  [-1.25]   
6                       2018-04-24 00:00:00           worn CL  [-5.50]   

           3     4      5                 6     7     8        9   \
0         NaN   NaN    NaN               NaN   NaN   NaN      NaN   
1         Cyl  Axis  BSCVA  Pentacam remarks    K1    K2  K2 back   
2     [-2.75]    65    6/9               NaN   NaN   NaN      NaN   
3         NaN   NaN    NaN               NaN   NaN   NaN      NaN   
4         NaN   NaN    6/5         Pentacam     46  43.9     -6.6   
5     [-5.75]    60  6/6-1               NaN   NaN   NaN      NaN   
6     [+7.00}   170  6/7.5               NaN   NaN   NaN      NaN   

           ...              17                18    19    20       21     22  \
0          ...             NaN               NaN   NaN   NaN      NaN    NaN   
1          ...           BSCVA  Pentacam remarks    K1    K2  K2 back  K max   
2          ...             6/5               NaN   NaN   NaN      NaN    NaN   
3          ...             NaN               NaN   NaN   NaN      NaN    NaN   
4          ...             NaN          Pentacam  44.3  43.7     -6.2   45.5   
5          ...           6/4-4               NaN   NaN   NaN      NaN    NaN   
6          ...             6/5               NaN   NaN   NaN      NaN    NaN   

Я хочу извлечь набор фреймов / рядов данных, которые затем можно объединить, чтобы получить «аккуратный» фрейм данных, например:

1                                      Date              R-UCVA      R-Sph   
2                       2007-01-13 00:00:00              6/38  [-2.00]   
3                       2009-11-05 00:00:00               6/9      NaN   
4                       2009-11-18 00:00:00              6/12      NaN   
5                       2009-12-14 00:00:00               6/9  [-1.25]   
6                       2018-04-24 00:00:00           worn CL  [-5.50]   

1       R-Cyl R-Axis R-BSCVA  R-Penta          R-K1   R-K2  R-K2 back   
2     [-2.75]    65    6/9               NaN   NaN   NaN      NaN   
3         NaN   NaN    NaN               NaN   NaN   NaN      NaN   
4         NaN   NaN    6/5         Pentacam     46  43.9     -6.6   
5     [-5.75]    60  6/6-1               NaN   NaN   NaN      NaN   
6     [+7.00}   170  6/7.5               NaN   NaN   NaN      NaN  

и т. Д.и т. д., поэтому я пытаюсь написать некоторый код, который будет тянуть ряд столбцов, которые я определяю, ища слова «Дата» или «UCVA» и т. д. и т. д. Затем я планирую объединить их обратно в один фрейм данных сидентификатор пациента в виде дополнительного столбца.А затем циклически перебирайте все файлы XLS, добавляя всю партию в один CSV-файл, над которым я могу потом делать полезные вещи (например, поместить в базу данных Access - да, я знаю, но он должен быть простым в использовании и уже установленным).на компьютере НГС - и статистический анализ).

Есть предложения?Надеюсь, этого достаточно.

Заранее большое спасибо.

С наилучшими пожеланиями, Вики

1 Ответ

0 голосов
/ 12 февраля 2019

Вот кое-что, что, мы надеемся, поможет вам начать.Я подготовил файл text.xlsx: Excel file, и я могу прочитать его следующим образом

    path = 'text.xlsx'

    df = pd.read_excel(path, header=[0,1])

    # Deal with two levels of headers, here I just join them together crudely 
    df.columns = df.columns.map(lambda h: '  '.join(h))

    # Slight hack because I messed with the column names
    # I create two dataframes, one with the first column, one with the second column
    df1 = df[[df.columns[0],df.columns[1]]]
    df2 = df[[df.columns[0], df.columns[2]]]

    # Stacking them on top of each other
    result = pd.concat([df1, df2])
    print(result)

    #Merging them on the Date column
    result = pd.merge(left=df1, right=df2, on=df1.columns[0])
    print(result)

Это дает выходные данные

  RIGHT  Sph RIGHT  UCVA       Unnamed: 0_level_0  Date
0        NaN              6/38      2007-01-13 00:00:00
1        NaN              6/37      2009-11-05 00:00:00
2        NaN              9/56      2009-11-18 00:00:00
0    [-2.00]               NaN      2007-01-13 00:00:00
1        NaN               NaN      2009-11-05 00:00:00
2        NaN               NaN      2009-11-18 00:00:00

и

  Unnamed: 0_level_0  Date RIGHT  UCVA       RIGHT  Sph
0      2007-01-13 00:00:00              6/38    [-2.00]
1      2009-11-05 00:00:00              6/37        NaN
2      2009-11-18 00:00:00              9/56        NaN

Некоторые указатели: Как объединить две строки заголовка?См. этот вопрос и ответ.

Как условно выбрать столбцы панд?См., Например, this или this

Как объединить кадры данных?В пандах есть очень хорошее руководство doc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...