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

Есть ли способ указать индекс, который я хочу для новой строки, при добавлении строки в кадре данных?

Оригинальная документация содержитследующий пример:

In [1301]: df = DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])

In [1302]: df
Out[1302]: 
          A         B         C         D
0 -1.137707 -0.891060 -0.693921  1.613616
1  0.464000  0.227371 -0.496922  0.306389
2 -2.290613 -1.134623 -1.561819 -0.260838
3  0.281957  1.523962 -0.902937  0.068159
4 -0.057873 -0.368204 -1.144073  0.861209
5  0.800193  0.782098 -1.069094 -1.099248
6  0.255269  0.009750  0.661084  0.379319
7 -0.008434  1.952541 -1.056652  0.533946

In [1303]: s = df.xs(3)

In [1304]: df.append(s, ignore_index=True)
Out[1304]: 
          A         B         C         D
0 -1.137707 -0.891060 -0.693921  1.613616
1  0.464000  0.227371 -0.496922  0.306389
2 -2.290613 -1.134623 -1.561819 -0.260838
3  0.281957  1.523962 -0.902937  0.068159
4 -0.057873 -0.368204 -1.144073  0.861209
5  0.800193  0.782098 -1.069094 -1.099248
6  0.255269  0.009750  0.661084  0.379319
7 -0.008434  1.952541 -1.056652  0.533946
8  0.281957  1.523962 -0.902937  0.068159

где новая строка автоматически получает метку индекса. Есть ли способ контролировать новый лейбл?

Ответы на вопрос(3)

Решение Вопроса

name серии становитсяindex строки в DataFrame:

In [99]: df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])

In [100]: s = df.xs(3)

In [101]: s.name = 10

In [102]: df.append(s)
Out[102]: 
           A         B         C         D
0  -2.083321 -0.153749  0.174436  1.081056
1  -1.026692  1.495850 -0.025245 -0.171046
2   0.072272  1.218376  1.433281  0.747815
3  -0.940552  0.853073 -0.134842 -0.277135
4   0.478302 -0.599752 -0.080577  0.468618
5   2.609004 -1.679299 -1.593016  1.172298
6  -0.201605  0.406925  1.983177  0.012030
7   1.158530 -2.240124  0.851323 -0.240378
10 -0.940552  0.853073 -0.134842 -0.277135
 Amelio Vazquez-Reina30 мая 2013 г., 00:47
Спасибо @unutbu. Знаете ли вы, если append возвращает копию / просмотр / ссылку на исходный фрейм данных?
 Saurabh Yadav23 нояб. 2017 г., 21:38
@gseattle df.xs (row_name) копирует значения строк в новую серию
 unutbu30 мая 2013 г., 01:40
Возвращает копию. Вы можете сказать, делаяdf2 = df.append(s), с последующимdf2.ix[0,'A'] = 1000 а затем проверить, еслиdf изменился (Это нет.)
 gseattle07 мая 2017 г., 20:26
Искусство обучения состоит в том, чтобы использовать простейший пример, который будет передавать понимание (сообщение многим о стековом потоке, а не выбирать только один). Кстати, что такое хз?

Я буду ссылаться на тот же образец данных, что и в вопросе:

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
print('The original data frame is: \n{}'.format(df))

Запуск этого кода даст вам

The original data frame is:

          A         B         C         D
0  0.494824 -0.328480  0.818117  0.100290
1  0.239037  0.954912 -0.186825 -0.651935
2 -1.818285 -0.158856  0.359811 -0.345560
3 -0.070814 -0.394711  0.081697 -1.178845
4 -1.638063  1.498027 -0.609325  0.882594
5 -0.510217  0.500475  1.039466  0.187076
6  1.116529  0.912380  0.869323  0.119459
7 -1.046507  0.507299 -0.373432 -1.024795

Теперь вы хотите добавить новую строку в этот фрейм данных, который неЭто должна быть копия любой другой строки во фрейме данных. @Alon предложил интересный подход к использованиюdf.loc добавить новую строку с другим индексом. Однако проблема с этим подходом заключается в том, что если в этом индексе уже есть строка, она будет перезаписана новыми значениями. Обычно это относится к наборам данных, когда индекс строки не является уникальным, например, идентификатор хранилища в наборах данных транзакций. Таким образом, более общее решение вашего вопроса состоит в том, чтобы создать строку, преобразовать данные новой строки в серию панд, присвоить им имя нужного индекса и затем добавить его во фрейм данных. Дон»не забудьте переписать исходный фрейм данных с фреймом с добавленной строкой. Причина вdf.append возвращает представление информационного кадра и не изменяет его содержимое. Ниже приведен код:

row = pd.Series({'A':10,'B':20,'C':30,'D':40},name=3)
df = df.append(row)
print('The new data frame is: \n{}'.format(df))

Следующим будет новый вывод:

The new data frame is:

           A          B          C          D
0   0.494824  -0.328480   0.818117   0.100290
1   0.239037   0.954912  -0.186825  -0.651935
2  -1.818285  -0.158856   0.359811  -0.345560
3  -0.070814  -0.394711   0.081697  -1.178845
4  -1.638063   1.498027  -0.609325   0.882594
5  -0.510217   0.500475   1.039466   0.187076
6   1.116529   0.912380   0.869323   0.119459
7  -1.046507   0.507299  -0.373432  -1.024795
3  10.000000  20.000000  30.000000  40.000000

df.loc сделает работу:

>>> df = pd.DataFrame(np.random.randn(3, 2), columns=['A','B'])
>>> df
          A         B
0 -0.269036  0.534991
1  0.069915 -1.173594
2 -1.177792  0.018381
>>> df.loc[13] = df.loc[1]
>>> df
           A         B
0  -0.269036  0.534991
1   0.069915 -1.173594
2  -1.177792  0.018381
13  0.069915 -1.173594
 riders99426 апр. 2018 г., 20:10
Это даетSettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame ошибка. Это все еще работает, но тамдолжно быть лучше.
 Alon08 мая 2018 г., 11:04
Я не получаю (любое) предупреждение: pandas версия 0.22.0 (python 2.7.6)

Ваш ответ на вопрос