Проблемы с добавлением новых строк в базу данных pandas

Извините, если форматирование на этом странно, это первый раз, когда я опубликовал что-нибудь. Я создал многоиндексный фрейм данных в Python, который отлично работает:

arrays = [['one','one', 'two', 'two'],
 ['A','B','A','B']]
tuples = list(zip(*arrays))
mindex = pd.MultiIndex.from_tuples(tuples)
s = pd.DataFrame(data=np.random.randn(4), index=mindex, columns=(['Values']))
s

Это прекрасно работает, за исключением того, что я думаю, что я мог бы добавить новые строки, просто набрав

s['Values'].loc[('Three', 'A')] = 1
s['Values'].loc[('Three','B')]= 2

Это не возвращает сообщение об ошибке, и я могу проверить, работает оно, введя

s['Values'].loc[('Three', 'A')]

Что дает мне 1. Итак, как и следовало ожидать. Тем не менее, я не вижу данные "Три" в ноутбуке Jupyter - если просто введите

s

то это только показывает мне оригинальную, две, строки A & B. Вероятно, это потому, что новая строка не является индексом:

s.index

возвращается

MultiIndex(levels=[['one', 'two'], ['A', 'B']],
 labels=[[0, 0, 1, 1], [0, 1, 0, 1]])

Может кто-нибудь, пожалуйста, дать мне подсказку о том, что происходит здесь? Я бы хотел, чтобы строки, которые я впоследствии добавлял, отображались в индексе. Должен ли я использовать функцию.append? Это кажется немного громоздким, и другие сообщения рекомендовали использовать вышеприведенный подход.loc для добавления строк.

Благодарю!

1 ответ

Я считаю, что вам нужно выбрать столбцы (столбцы) в функции DataFrame.loc:

s.loc[('Three', 'A'), 'Values'] = 1
s.loc[('Three', 'B'), 'Values'] = 2
print (s)
 Values
one A -0.808372
 B 0.904552
two A -0.443619
 B 1.157234
Three A 1.000000
 B 2.000000

print (s.index)

MultiIndex(levels=[['one', 'two', 'Three'], ['A', 'B']],
 labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]])

потому что ваше решение добавляет значения в столбец (Series), но не в DataFrame:

s['Values'].loc[('Three', 'A')] = 1

print (s['Values'])
one A -0.808372
 B 0.904552
two A -0.443619
 B 1.157234
Three A 1.000000
Name: Values, dtype: float64

print (s)
 Values
one A -0.808372
 B 0.904552
two A -0.443619
 B 1.157234

licensed under cc by-sa 3.0 with attribution.