Повторите каждую строку DataFrame N раз, чтобы создать новый DataFrame (N определяется другим столбцом)

Я новичок в Pandas, и недавно у меня возникла проблема, которую я не смог решить с помощью MS Excel. У меня есть DataFrame df, например:

    Jobtype  JobCount Degree
0   BI Analyst  3     Winf
1   BI Analyst  2     Wing
2   BI Analyst  5     Wiwi
3   Marketing   1     Winf
4   Marketing   2     Wing
5   Marketing   6     Wiwi

(Примечание: это немецкие сокращения для степени)

Что я хочу сделать, так это создать новый пустой DataFrame, в котором есть столбцы «JobType» и «Degree» с теми же значениями, НО вместо столбца «JobCount» я хочу, чтобы одна и та же строка была добавлена ​​​​в раз JobCount новый, пустой DataFrame. Например, я хочу, чтобы новый DataFrame выглядел так:

    Jobtype     Studiengang
0   BI Analyst  Winf
1   BI Analyst  Winf
2   BI Analyst  Winf
3   BI Analyst  Wing
4   BI Analyst  Wing
...

Поэтому скопируйте строку JobCount-times в новый DataFrame без столбца JobCount (JobCount-times означает значение для JobCount в этой конкретной строке). На самом деле я решил эту проблему, но это заняло у меня слишком много времени, и я не думаю, что мое решение является правильным, должен быть более простой способ сделать это, и поэтому я прошу помощи, так как я не мог найти правильный решение.

Мой код (который работает, но слишком сложен):

df = pd.read_csv("tete.csv", sep = ";")

cols = ["Jobtype", "Degree"]
new = pd.DataFrame(columns = cols)

df_row_count = range(0, len(df.index))
new_row_count = 0

for i in df_row_count:
    job_count = 0
    while job_count < df.iloc[i]["JobCount"]:
        new.loc[new_row_count] = df.loc[I]
        job_count += 1 
        new_row_count += 1

print(new)
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Давайте попробуем repeat и reindex:

(df.drop('JobCount', 1)
   .reindex(df.index.repeat(df['JobCount']))
   .reset_index(drop=True))

Или, если вы хотите что-то немного короче, вы можете повторять:

(df.reindex(df.index.repeat(df.pop('JobCount')))
   .reset_index(drop=True))
       Jobtype Degree
0   BI Analyst   Winf
1   BI Analyst   Winf
2   BI Analyst   Winf
3   BI Analyst   Wing
4   BI Analyst   Wing
5   BI Analyst   Wiwi
6   BI Analyst   Wiwi
7   BI Analyst   Wiwi
8   BI Analyst   Wiwi
9   BI Analyst   Wiwi
10   Marketing   Winf
11   Marketing   Wing
12   Marketing   Wing
13   Marketing   Wiwi
14   Marketing   Wiwi
15   Marketing   Wiwi
16   Marketing   Wiwi
17   Marketing   Wiwi
18   Marketing   Wiwi
 

Я внимательно рассмотрю эти коды, спасибо!

funwide 25.12.2020 23:01

@funwide, чего бы это ни стоило, этот ответ работает без необходимости импортировать numpy, и я очень горжусь тем, как это получилось, просто говорю.

cs95 25.12.2020 23:30

Используйте повторение numpy для создания нового фрейма данных с теми же именами столбцов, что и у оригинала, и удалите столбец JobCount.

 import numpy as np
newdf = pd.DataFrame(np.repeat(df.values,df.JobCount,axis=0), columns=df.columns).drop(columns=['JobCount'])#Replicate rows as per condition


    Jobtype   Degree
0   BIAnalyst   Winf
1   BIAnalyst   Winf
2   BIAnalyst   Winf
3   BIAnalyst   Wing
4   BIAnalyst   Wing
5   BIAnalyst   Wiwi
6   BIAnalyst   Wiwi
7   BIAnalyst   Wiwi
8   BIAnalyst   Wiwi
9   BIAnalyst   Wiwi
10  Marketing   Winf
11  Marketing   Wing
12  Marketing   Wing
13  Marketing   Wiwi
14  Marketing   Wiwi
15  Marketing   Wiwi
16  Marketing   Wiwi
17  Marketing   Wiwi
18  Marketing   Wiwi

К сожалению, я не знаю библиотеки Numpy, но я посмотрю на нее! Спасибо

funwide 25.12.2020 23:00

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