добавление строки в пустой фрейм данных возвращает пустой фрейм данных

#python #pandas

#python #панды

Вопрос:

У меня есть пустой фрейм данных, созданный из:

 empty_df = pd.DataFrame(index = ['100', '75', '50'])
  

Что я хочу сделать, так это добавить объект серии в empty_df с определенным индексом:

     empty_df.loc['75'] = pd.Series({'a': 1, 'b' : 2, 'c' : 3})
    empty_df.loc['100'] = pd.Series({'a': 4, 'b' : 5, 'c' : 6})
  

Но empty_df возвращает пустой фрейм данных, индекс которого по-прежнему равен 100, 75, 50.

Конечный результат должен быть:

     a     b     c
100 4     5     6
75  1     2     3
  

Почему добавление объекта Series в определенный индекс возвращает пустой фрейм данных?

Связанные решения также не работают.

Комментарии:

1. Вы написали emtpy_df во втором блоке кода вместо empty_df .

2. Разве вы не должны инициировать empty_df with columns=['a','b','c'] ? .loc в данном случае присваивания, похоже, выравнивают соответствующий индекс columns .

3. @Michaelsczesny Это была моя ошибка. Я изменил его.

4. @QuangHoang Это работает правильно, если я устанавливаю столбцы в пустой фрейм данных. Но как добавить строки в фрейм данных, столбцы которого не заданы перед добавлением?

5. Вам нужно посмотреть pd.concat или merge , или join .

Ответ №1:

Так что это не работает, потому что в вашем empty_df нет этих столбцов a, b и c, поэтому нам нужно сначала добавить их.

Итак, допустим, вы не знаете имена столбцов заранее, тогда вы можете добавить их с помощью .переиндексация ().

Если вы знаете имена столбцов заранее, просто используйте решение Клемента Молина.

 empty_df = pd.DataFrame(index = ['100', '75', '50'])
series1 = pd.Series({'a': 1, 'b' : 2, 'c' : 3})
series2 = pd.Series({'a': 4, 'b' : 5, 'c' : 6})

empty_df = empty_df.reindex(columns=series1.keys())

empty_df.loc['75'] = series1
empty_df.loc['100'] = series2

empty_df.dropna()
  

Результирующий фрейм данных:

     a   b   c
100 4.0 5.0 6.0
75  1.0 2.0 3.0
  

Ответ №2:

Если вы заранее знаете имена столбцов, вам следует задать их при создании фрейма данных, и в этом случае вам даже не нужно устанавливать index , следующим образом:

 import pandas as pd

empty_df = pd.DataFrame(columns=['a', 'b', 'c'])
empty_df.loc['75'] = pd.Series({'a': 1, 'b' : 2, 'c' : 3})
empty_df.loc['100'] = pd.Series({'a': 4, 'b' : 5, 'c' : 6})

print(empty_df)
     a  b  c
75   1  2  3
100  4  5  6
  

Если вы не знаете имена столбцов заранее, вы также можете использовать append , следующим образом:

 empty_df = pd.DataFrame()
empty_df = empty_df.append(pd.Series({'a': 1, 'b' : 2, 'c' : 3}, name='75'))
empty_df = empty_df.append(pd.Series({'c': 3, 'd' : 4, 'e' : 5}, name='100'))

print(empty_df)
       a    b    c    d    e
75   1.0  2.0  3.0  NaN  NaN
100  NaN  NaN  3.0  4.0  5.0
  

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

 empty_df = empty_df.append(pd.Series({'a': 1, 'b' : 2, 'c' : 3}, name='75'))
print(empty_df)
       a    b    c    d    e
75   1.0  2.0  3.0  NaN  NaN
100  NaN  NaN  3.0  4.0  5.0
75   1.0  2.0  3.0  NaN  NaN