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

Я борюсь с этим.

Предположим, что фрейм данных выглядит следующим образом:

df = pd.DataFrame({'col0':['string1', 'string2'],
                   'col1':['some string','another string'],
                   'start':[100,1],
                   'end':[107,5]})

      col0            col1  start  end
0  string1     some string    100  107
1  string2  another string      1    5

Цель состоит в том, чтобы найти разницу между start и end, а затем добавить столько же строк в мой фрейм данных, остальные столбцы ffill и добавить совокупный счет для диапазона между start и end. Ожидаемый результат ниже:

df2 = pd.DataFrame({'col0':['string1']*8, 
                    'col1':['some string']*8,
                    'new_col':[x for x in range(100,108)]})

df3 = pd.DataFrame({'col0':['string2']*5, 
                    'col1':['another string']*5,
                    'new_col':[x for x in range(1,6)]})

output = pd.concat([df2,df3]).reset_index(drop=True)

       col0            col1  new_col
0   string1     some string      100
1   string1     some string      101
2   string1     some string      102
3   string1     some string      103
4   string1     some string      104
5   string1     some string      105
6   string1     some string      106
7   string1     some string      107
8   string2  another string        1
9   string2  another string        2
10  string2  another string        3
11  string2  another string        4
12  string2  another string        5

Моим первым шагом было создание нового фрейма данных... что-то вроде:

vals = list(zip(df['start'], df['end']+1))
pd.concat([pd.DataFrame([i], columns=['new_col']) for val in vals for i in range(*val)])

но это кажется довольно неэффективным, и я изо всех сил пытаюсь добавить оставшиеся данные.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

1-й Создайте столбец списка, используя цикл for с range, тогда проблема станет раскладывание

df['New']=[list(range(y,x+1)) for x , y in zip(df.pop('end'),df.pop('start'))]
unnesting(df,['New'])
   New     col0            col1
0  100  string1     some string
0  101  string1     some string
0  102  string1     some string
0  103  string1     some string
0  104  string1     some string
0  105  string1     some string
0  106  string1     some string
0  107  string1     some string
1    1  string2  another string
1    2  string2  another string
1    3  string2  another string
1    4  string2  another string
1    5  string2  another string

к вашему сведению

def unnesting(df, explode):
    idx=df.index.repeat(df[explode[0]].str.len())
    df1=pd.concat([pd.DataFrame({x:np.concatenate(df[x].values)} )for x in explode],axis=1)
    df1.index=idx
    return df1.join(df.drop(explode,1),how='left')

@ Крис yw :-) -

BENY 30.01.2019 03:51

Другие вопросы по теме