#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 (), он возвращается пустым.