Разделение столбца информационного кадра на ';'копирование всех статических строк и выполнение математических операций над другими - PullRequest
0 голосов
/ 23 октября 2019

Итак, у меня есть кадр данных, который был прочитан из CSV. Он имеет 36 столбцов и более 3000 строк. Я хочу разбить фрейм данных на столбец, содержащий элементы, разделенные точкой с запятой.

Это данные о покупке и в основном содержат строки, которые я хотел бы просто скопировать для разделения;например: номер счета-фактуры, торговый представитель и т. д. Это первый шаг, и я нашел много ответов на этот вопрос в SO, но ни один из них не подходит для второй части.

Существуют другие столбцы: Количество, РасширенныйСтоимость, Расширенная цена и Расширенная валовая прибыль, которые необходимо будет пересчитать на основе разделения. Количество для строк со значениями в рассматриваемом столбце должно быть равно 1 для каждого элемента в списке;последующие столбцы необходимо будет пересчитать на основе этого столбца.

См. ниже пример DF:

example data

Как мне поступить?

Многие реализации используют df.split(';'), а некоторые используют df.apply, но, к сожалению, я не понимаю процесс спереди назад.

Редактировать: Я ищу выходные данные: Предлагаемый вывод

1 Ответ

1 голос
/ 23 октября 2019

Используя pandas 0.25.1+, вы можете использовать explode:

import pandas as pd
import numpy as np


df = pd.DataFrame({'Quantity':[6,50,25,4]
                  ,'Column in question':['1;2;3;4;5;6','','','7;8;9;10']
                  ,'Price':['$1.00','$10.00','$0.10','$25.00']
                  ,'Invoice Close Date':['9/3/2019','9/27/2019','9/18/2019','9/30/2019']})

df_out = df.assign(ciq=df['Column in question'].str.split(';')).explode('ciq')\
           .drop('Column in question', axis=1)\
           .rename(columns={'ciq':'Column in question'})

df_out['Quantity'] = (df_out['Quantity'] / df_out.groupby(level=0)['Quantity'].transform('size'))

df_out

Вывод:

   Quantity   Price Invoice Close Date Column in question
0       1.0   $1.00           9/3/2019                  1
0       1.0   $1.00           9/3/2019                  2
0       1.0   $1.00           9/3/2019                  3
0       1.0   $1.00           9/3/2019                  4
0       1.0   $1.00           9/3/2019                  5
0       1.0   $1.00           9/3/2019                  6
1      50.0  $10.00          9/27/2019                   
2      25.0   $0.10          9/18/2019                   
3       1.0  $25.00          9/30/2019                  7
3       1.0  $25.00          9/30/2019                  8
3       1.0  $25.00          9/30/2019                  9
3       1.0  $25.00          9/30/2019                 10

Подробности:

Сначала создайте столбец, содержащийсписок с использованием str.split и assign. Затем используйте explode, затем rename новый столбец со старым именем после drop.

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