2015-10-11 1 views
1

У меня есть панд DataFrame (названная «df1») со следующей структурой (хотя у меня есть много месяцев ежедневных данных):Панда: сохранение даты, чтобы при использовании GroupBy или сводной таблице

  date WeightedReturn 
0 15/07/2015  0.005128 
1 15/07/2015  0.002844 
2 15/07/2015  0.003055 
3 15/07/2015  -0.001481 
4 15/07/2015  -0.000741 
5 15/07/2015  -0.000741 
6 16/07/2015  -0.004253 
7 16/07/2015  -0.001712 
8 16/07/2015  -0.001712 
9 21/07/2015  -0.000178 
10 21/07/2015  -0.000089 
11 21/07/2015  -0.00008 

и I хочу создать новую DataFrame от этого, который действует в качестве сводной таблицы и сливает поля даты и суммы, взвешенные возвращения для конкретной даты, чтобы получить что-то вроде этого:

date  WeightedReturn 
0 15/07/2015 0.00806425 
1 16/07/2015 -0.007676 
2 21/07/2015 -0.000356 

Я попытался с помощью «GroupBy функции»:

df2 = df1.groupby('date').sum() 

Это (вроде) работает, но выход сортирует дату неправильно следующим образом:

  WeightedReturn 
date      
01/09/2015  0.004803 
02/09/2015  0.005144 
03/08/2015  -0.000120 
03/09/2015  -0.025164 
04/08/2015  0.003956 
04/09/2015  0.008942 
05/08/2015  -0.01323 

Который, как вы можете видеть не в хронологическом порядке.

Поэтому я попытался использовать функцию сводной таблицы, но я очень смущен, прочитав документацию относительно ее использования.

Я попытался:

df2 = pandas.pivot_table(df1, values="Weighted Return", index="date",aggfunc=np.sum) 

Я получаю сообщение об ошибке:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\site-packages\pandas\tools\pivot.py", line 147, in pivot_table 
    table = table[values[0]] 
    File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 1791, in __getitem__ 
    return self._getitem_column(key) 
    File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 1798, in _getitem_column 
    return self._get_item_cache(key) 
    File "C:\Python27\lib\site-packages\pandas\core\generic.py", line 1084, in _get_item_cache 
    values = self._data.get(item) 
    File "C:\Python27\lib\site-packages\pandas\core\internals.py", line 2851, in get 
    loc = self.items.get_loc(item) 
    File "C:\Python27\lib\site-packages\pandas\core\index.py", line 1578, in get_loc 
    return self._engine.get_loc(_values_from_object(key)) 
    File "pandas\index.pyx", line 134, in pandas.index.IndexEngine.get_loc (pandas\index.c:3811) 
    File "pandas\index.pyx", line 154, in pandas.index.IndexEngine.get_loc (pandas\index.c:3691) 
    File "pandas\hashtable.pyx", line 697, in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12336) 
    File "pandas\hashtable.pyx", line 705, in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12287) 
KeyError: 'Weighted Return' 

Может некоторые молодчина указать, где я неправильно, пожалуйста?

+0

Что случилось с начальной группой? Затем просто сортируйте по индексу. Не думайте, что вам нужен свод. (Ваш стержень по тому, как указано имя «Weighted Return» с пробелами, в то время как ваш df не имел пробелов, объясняя ошибку ключа) – ako

+0

Также похоже, что ваша дата - это строка, приводящая к буквенно-цифровой сортировке. – ako

ответ

5

Если вы не хотите groupby отсортировать значения (его поведение по умолчанию), просто передать в sort=False:

>>> df.groupby('date', sort=False).sum() 
      WeightedReturn 
date      
15/07/2015  0.008064 
16/07/2015  -0.007677 
21/07/2015  -0.000347 

Значения будут упорядочены, как они впервые появляются в колонке. В качестве альтернативы вы можете преобразовать столбец даты в тип datetime64, а затем использовать группу по-прежнему: на данный момент у вас есть только строки даты, которые сортируются лексикографически.

Ошибка с вашей сводной таблицей состоит в том, что вы ввели имя столбца как «взвешенное возвращение» (обратите внимание на пробел) вместо «WeightedReturn». Однако pivot_table всегда будет возвращать отсортированный индекс, который возвращается к исходной проблеме.

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