#python #pandas #dataframe #append
Вопрос:
У меня есть этот код
def expander(input_dataframe, n): d = dict(tuple(input_dataframe.groupby(input_dataframe.columns[0]))) u = input_dataframe['Type'].unique() cols = ['Type', 'Variants'] df2 = pd.DataFrame(columns=cols, index=range(n)) for i in range(len(u)): df2 = d[u[i]].copy() df2["Variants"] = np.nan df2 df3 = input_dataframe.append(df2, ignore_index=True) print(df3)
Когда я запускаю код с :
expander(input_dataframe=pd.DataFrame({ 'Type':['iPhone', 'iPhone', 'iPhone', 'iPhone', 'Samsung', 'Samsung', 'Samsung', 'Samsung'], 'Variants':['12 Mini', '12', '12 Pro', '12 Pro Max', 'S21 FE', 'S21', 'S21 ', 'S21 Ultra'] }), n = 4)
Я ожидал, что результат будет таким :
Но вместо этого я получил вот что :
Как я могу это решить?
Комментарии:
1. Вы перезаписываете
df2
вариант для iPhonedf2
вариантом для Samsung. Если вы переместите свойdf3 = input_dataframe.append(df2, ignore_index=True)
в цикл (поэтому просто сделайте отступ на один отступ), вы, вероятно, получите то, что хотите.2. Обратите внимание, что есть еще одна ошибка: вы создаете базу
df2
нужного вам размера (n
), но они внутри цикла, опять же, сразу же перезаписывают ее из-заdf2 = d[u[i]].copy()
строки. Это та же ошибка, что и в моем комментарии выше, но она проявляется по-другому: количество добавленных строк будет соответствовать количеству существующих строк для этого типа (в обоих случаях это 4, как раз то, что вы установилиn
, поэтому вы этого не заметите. Но изменитеn=5
последнюю строку (где вы звонитеexander()
, и вы увидите, как все пойдет не так.3. Дополнительный комментарий:
NaN
для строкового типа (столбец Variant) в моем варианте плохая идея: NaN-это тип числа (несмотря на то, что в его названии указано, что это не число). ПростоNone
или пустая строка,""
для значений, где вы не знаете вариант.4. Привет, большое вам спасибо за совет 🙂 Это для моего задания, и то, что вы упомянули ранее, является ограничением, которое должно существовать в коде, где n не может превышать исходное количество строк в группе. И я попытался ввести
df3 = input_dataframe.append(df2, ignore_index=True)
его в цикл, но это все равно не дает ожидаемого результата.5. Ах, да, я упустил это из виду: сделайте свою последнюю строку
input_dataframe.append(df2, ignore_index=True)
(и держите ее в цикле). Снова та же ошибка: вы назначаетеdf3
дважды, но никогда не отслеживаете обновления. Заменаdf3
наinput_dataframe
сделает это.