#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
withcolumns=['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