как разбить данные в значении столбца на несколько строк в фрейме данных pandas

#python #python-3.x #pandas #dataframe

Вопрос:

У меня проблема, когда у меня есть несколько строк в файле csv, которые необходимо преобразовать в фрейм данных pandas, но есть некоторые строки, в которых столбцы » имя » и «бизнес» имеют несколько имен и предприятий, которые должны находиться в отдельных строках и должны быть разделены, сохраняя данные из других столбцов одинаковыми для каждой разделенной строки.

Вот пример данных:

вход:

Программное обеспечение Имя бизнес
азбука Эндрю Джонсон, Стив Мартин Аутсорсинг/Офшоринг, 201-500 сотрудников,Здравоохранение, Велнес и Фитнес, 5001-10 000 сотрудников
xyz Джек Джонс, Рик Пол, Джонни Джонс Банковское дело, 1001-5000 сотрудников,Строительство, 51-200 сотрудников,Товары народного потребления, 10 001 сотрудников
защита Том Д., Конни Джей, Рики Б. Неуказанный, Неуказанный, Самозанятый

вывод, который мне нужен:

Программное обеспечение Имя бизнес
азбука Эндрю Джонсон Аутсорсинг/Офшоринг, 201-500 сотрудников
азбука Стив Мартин Здоровье, хорошее самочувствие и Фитнес, 5001-10 000 сотрудников
xyz Джек Джонс Банковское дело, 1001-5000 сотрудников
xyz Рик Пол Строительство, 51-200 сотрудников
xyz Джонни Джонс Товары народного потребления, 10 001 сотрудников
защита Том Д Неуточненный
защита Конни Джей Неуточненный
защита Рики Би Самозанятый

Существуют дополнительные столбцы, похожие на » имя » и «бизнес», которые содержат несколько частей информации, которые необходимо разделить так же, как » имя » и «бизнес». Ячейки, содержащие несколько фрагментов информации, расположены последовательно (упорядоченно).

Вот код, который у меня есть до сих пор, и создает новые строки, но он разбивает содержимое только в столбце имя, но при этом остается столбец бизнес и несколько других столбцов, которые необходимо разделить вместе с содержимым из столбца имя.

 name2 = df.name.str.split(',', expand=True).stack()
df = df.join(pd.Series(index=name2.index.droplevel(1), data=name2.values, name = 'name2'))

dict = df.to_dict('record')
for row in dict:
    new_segment = {}
    new_segment['name'] = str(row['name2'])
    #df['name'] = str(row['name2'])

    for col,content in new_segment.items():
            row[col] = content

df = pd.DataFrame.from_dict(dict)

df = df.drop('name2', 1)
 

Вот альтернативное решение, которое я тоже пробовал, но оно тоже выдает ошибку:

 review_path = r'data/base_data'
review_files = glob.glob(review_path   "/test_data.csv")

review_df_list = []
for review_file in review_files:
    df = pd.read_csv(io.StringIO(review_file), sep = 't')
    print(df.head())
    df["business"] = (df["business"].str.extractall(r"(?:[s,]*)(.*?(?:Unspecified|employees|Self-employed))").groupby(level=0).agg(list))
    df["name"] = df["name"].str.split(r"s*,s*")
    print(df.explode(["name", "business"]))
    outPutPath = Path('data/base_data/test_data.csv')
    df.to_csv(outPutPath, index=False)
 

Сообщение об ошибке для альтернативного решения:

Читать:данные/base_data/review_base.csv

Успех!

Пустой фрейм данных

Столбцы: [данные/базовые данные/test_data.csv]

Индекс: []

Ответ №1:

Попробуй:

 df["business"] = (
    df["business"]
    .str.extractall(r"(?:[s,]*)(.*?(?:Unspecified|employees|Self-employed))")
    .groupby(level=0)
    .agg(list)
)
df["name"] = df["name"].str.split(r"s*,s*")

print(df.explode(["name", "business"]))
 

С принтами:

   software            name                                             business
0      abc  Andrew Johnson            Outsourcing/Offshoring, 201-500 employees
0      abc    Steve Martin  Health, Wellness and Fitness, 5001-10,000 employees
1      xyz      Jack Jones                         Banking, 1001-5000 employees
1      xyz       Rick Paul                       Construction, 51-200 employees
1      xyz    Johnny Jones                    Consumer Goods, 10,001  employees
2      def          Tom D.                                          Unspecified
2      def       Connie J.                                          Unspecified
2      def        Ricky B.                                        Self-employed
 

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

1. Я обновил свой вопрос, включив в него код, который вы только что опубликовали, но мне все еще кажется, что я получаю сообщение об ошибке. Я включил сообщение об ошибке в свой вопрос, а также обновленное решение, которое вы опубликовали. Вы случайно не знаете, почему у меня все еще возникает эта проблема?

2. @JackJones, глядя на ошибку, кажется, что столбец business отсутствует? Есть ли столбец business (чувствительный к регистру) в вашем CSV?

3. Да, колонка «бизнес» действительно существует, и она написана именно так. По какой-то причине я загружаю csv-файл, используя приведенный выше код, но когда я печатаю df.head (), он возвращается пустым.