Python/Pandas — Не удается добавить все строки в фрейм данных

#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 вариант для iPhone df2 вариантом для 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 сделает это.