Текст в разные столбцы с пандами с помощью разделителей - PullRequest
1 голос
/ 27 июня 2019

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

Это пример того, как мои данные выглядят так: enter image description here

Как видите, в каждой ячейке указано разное количество людей. Я хочу окончательный вывод, как это: enter image description here

Всегда следует имя человека, за которым следует (-), и я забочусь только о трех первых данных о каждом человеке, которые соответствуют имени, названию и электронному адресу, остальные излишни. Я пробовал текст в столбцы в Excel, и он удалил большинство строк. Кроме того, я попытался разделить по разделителю с регулярным выражением, но я не могу сделать это в нескольких столбцах, так как я должен разделить количество столбцов.

Итак, мне нужен код, чтобы перебрать все строки, разделить информацию на (-) и поместить первую строку после (-) в первом столбце, вторую строку после (;) во втором столбце и третья строка после (;) в третьем столбце и т. д. Это должно продолжаться неограниченное количество раз, так как некоторые ячейки имеют одного члена, а другие - несколько.

Спасибо

1 Ответ

1 голос
/ 27 июня 2019

Хедз-ап. Если вы пытаетесь разделить на основе "-", обратите внимание, что этот символ также появляется в других местах, например, "Соучредитель". Один из подходов может состоять в том, чтобы сначала обработать эти экземпляры так, чтобы «-» когда-либо появлялся только перед именем. Как вы упомянули, вы хотите использовать DataFrame от pandas, для применения информации каждой строки можно использовать инструкцию apply:

import itertools

import pandas as pd


def format_records(row):
    """Split records to construct DataFrame"""

    # Replace 'Co-Founder' with 'CoFounder'. The '-' will cause the split command to think Founder is someone's name
    row = row[0].replace('Co-Founder', 'CoFounder').replace('Co-founder', 'CoFounder')

    # Split each record (one per person) using '-' as the delimiter
    records = row.split('-')[1:]

    # Split data constituting each record by ';' and return the first three elements
    elements = [r.split(';')[:3] for r in records]

    # Construct new row by joining the first three elements of each record
    new_row = list(itertools.chain.from_iterable(elements))

    # Correct for the previous co-founder conversion
    new_row = [r.replace('CoFounder', 'Co-Founder') for r in new_row]

    # Convert to series
    new_series = pd.Series(new_row)

    return new_series


if __name__ == '__main__':
    # Read in data
    df = pd.read_excel('data.xlsx', header=None)

    # Re-organise data
    new_df = df.apply(format_records, axis=1)

    # Number of times the ['Name', 'Title', 'Email'] sequence should repeat (based on number of columns of new_df)
    repetitions = int(new_df.shape[1] / 3)

    # Add column names
    new_df.columns = ['Name', 'Title', 'Email'] * repetitions
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...