2016-07-29 2 views
2

У меня есть dataframe как этотОбъединить столбцы в панд на основе критериев даты

In[337]: df 
Out[337]: 
       2013  2014  2015 
2013-01-31 0.705935 0.983307 0.714397 
2013-05-31 0.492020 0.3 0.897666 
2013-09-30 0.187822 0.779611 0.774774 
2014-01-31 0.789511 0.383665 0.353669 
2014-05-31 0.347580 0.540767 0.732863 
2014-09-30 0.382052 0.960596 0.917685 
2015-01-31 0.106079 0.622926 0.302552 
2015-05-31 0.282134 0.195239 0.968098 
2015-09-30 0.185158 0.410412 0.048988 

Я пытаюсь объединить данные в новый столбец на основе года в индексе. например «для строки 2014-09-30 выбрать данные из столбца„2014“, 0,960596»

Out[345]: 
       data 
2013-01-31 0.705935 
2013-05-31 0.492020 
2013-09-30 0.187822 
2014-01-31 0.383665 
2014-05-31 0.540767 
2014-09-30 0.960596 
2015-01-31 0.302552 
2015-05-31 0.968098 
2015-09-30 0.048988 

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

Благодарим за помощь!

ответ

3

Предполагая даты разобраны вы можете сделать это:

df.apply(lambda row: row[str(row.name.year)], axis=1) 

Edit:

Это было то, что я искал:

pd.Series(
    df.lookup(
     row_labels=df.index, 
     col_labels=df.index.year.astype(str) 
    ), 
    index=df.index 
) 

The lookup метод дает вам за каждую указанную метку строки значение на соответствующая метка столбца. Эта функция быстрее на кучи (если я перепрограммирую DataFrame почасово, первый метод синхронизируется с ~ 3,5 с, а метод lookup заканчивается в ~ 20 мс).

+0

..19 секунды;) – mhoff

+0

+1, очень хорошее решение. Можете ли вы добавить свой тест к ответу? Кроме того, я думаю, что для других было бы полезно включить, как преобразовать серию в требуемый фрейм данных, например. 'pd.DataFrame (pd.Series (...), columns = ['data'])'. – mhoff

2
import pandas as pd 
import datetime 

# reproduce test data 
> df = pd.DataFrame([[datetime.date(2013,01,31), 0.1, 0.2, 0.3], [datetime.date(2014,01,31), 0.1, 0.2, 0.3], [datetime.date(2015,01,31), 0.1, 0.2, 0.3]], columns=['date', '2013', '2014', '2015']).set_index('date') 
> df.index.name = None 
> df 
      2013 2014 2015 
2013-01-31 0.1 0.2 0.3 
2014-01-31 0.1 0.2 0.3 
2015-01-31 0.1 0.2 0.3 

# extract year and use it as a key for the row object 
> df.apply(lambda r: r[str(r.name.year)], axis=1) 
2013-01-31 0.1 
2014-01-31 0.2 
2015-01-31 0.3 

# create the desired dataframe 
> df_new = pd.DataFrame(df.apply(lambda r: r[str(r.name.year)], axis=1), index=df.index, columns=['data']) 
> df_new 
      data 
2013-01-31 0.1 
2014-01-31 0.2 
2015-01-31 0.3 
+1

Закрыть один;). Кстати, вы можете проанализировать данные из вопроса, используя 'df = pd.read_table (io.StringIO (" "" ... "" ", parse_dates = True, delim_whitespace = True))'. – filmor

+0

Спасибо, я этого не знал. – mhoff

+0

@filmor: Кстати, мне пришлось написать 'u" "" ... "" "', чтобы он работал. – mhoff

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