2015-07-03 3 views
3

Я новичок в панд, но при попытке просто добавить строкупанд добавить строку вместо столбца

class Security: 
    def __init__(self): 
     self.structure = ['timestamp', 'open', 'high', 'low', 'close', 'vol'] 
     self.df = pd.DataFrame(columns=self.structure) # index = 
    def whats_inside(self): 
     return self.df 
    """ 
    Some skipped code... 
    """ 
    def add_data(self, timestamp, open, high, low, close, vol): 
     data = [timestamp, open, high, low, close, vol] 
     self.df = self.df.append (data) 

sec = Security() 
print sec.whats_inside() 
sec.add_data ('2015/06/01', '1', '2', '0.5', '1', '100') 
print sec.whats_inside() 

но вывод:

  0 close high low open timestamp vol 
0 2015/06/01 NaN NaN NaN NaN  NaN NaN 
1   1 NaN NaN NaN NaN  NaN NaN 
2   2 NaN NaN NaN NaN  NaN NaN 
3   0.5 NaN NaN NaN NaN  NaN NaN 
4   1 NaN NaN NaN NaN  NaN NaN 
5   100 NaN NaN NaN NaN  NaN NaN 

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

p.s. Я знаю, что это просто, но я просто пропустил что-то важное.

ответ

5

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

df.loc[len(df)] = ['val_a', 'val_b', .... ] 

loc ожидает индекс. len(df) вернет количество строк в фреймворке данных, чтобы новая строка была добавлена ​​в конец фрейма данных.

'[' val_a ',' val_b ', ....]' - это список значений строки в том же порядке столбцов, поэтому длина списка должна быть равна числу столбцов, в противном случае вы получите исключение ValueError. Исключением для этого является то, что если вы хотите, чтобы все столбцы имели одинаковые значения, вам разрешено иметь это значение как один элемент в списке, например df.loc[len(df)] = ['aa'].

Примечание: хорошая идея будет всегда использовать reset_index перед использованием этого метода, потому что если вы когда-либо удалить строку или работать на фильтрованной dataframe вы не гарантировано, что индексы Ряды будут синхронизированы с номером строк.

+0

Нечаянно я обнаружил, что это решение (с использованием LOC вместо Append) является ** WAY БЫСТРЕЕ **, так что каждый должен рассмотреть вопрос об использовании Это. – pmus

+1

хорошо работает для меня. Это не кажется очень очевидным, хотя ... или pythonic? Есть ли другой способ, с которым легче справиться? У меня создается впечатление, что панды на самом деле не написаны с добавлением строк. – Chogg

+0

@Chogg См. ['.append'] (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.append.html) и [' .concat'] (https: // pandas .pydata.org/панды-документы/стабильный/генерироваться/pandas.concat.html). Однако это может быть медленнее, чем использование .loc' – DeepSpace

2

Вы должны добавить серию или DataFrame. (Серия будет более уместно в вашем случае)

import pandas as pd 
from pandas import Series, DataFrame 
class Security: 
    def __init__(self): 
     self.structure = ['timestamp', 'open', 'high', 'low', 'close', 'vol'] 
     self.df = pd.DataFrame(columns=self.structure) # index = 
    def whats_inside(self): 
     return self.df 
    """ 
    Some skipped code... 
    """ 
    def add_data(self, timestamp, open, high, low, close, vol): 
     data = [timestamp, open, high, low, close, vol] 
     # append Series 
     self.df = self.df.append(pd.Series(data, index=self.structure), ignore_index=True) 
     # or DataFrame 
     # self.df = self.df.append(pd.DataFrame([data], columns=self.structure), ignore_index=True) 

sec = Security() 
print sec.whats_inside() 
sec.add_data ('2015/06/01', '1', '2', '0.5', '1', '100') 
sec.add_data ('2015/06/02', '1', '2', '0.5', '1', '100') 
print sec.whats_inside() 

Выход:

timestamp open high low close vol 
0 2015/06/01 1 2 0.5  1 100 
1 2015/06/02 1 2 0.5  1 100 
+0

Это лучшее решение! только workind моих некрасивых усилий было: данные = [[временная метка], [открыть], [высокий], [низкий], [закрыть], [т]] mydict = ДИКТ (почтовый (сам .структура, данные)) новый = pd.DataFrame (mydict) self.table = self.table.append (новый) Это ужасно. Большое спасибо! – pmus

Смежные вопросы