根据日期条件合并Pandas中的列

时间:2016-07-29 09:18:41

标签: python pandas

我有一个像这样的数据框

In[337]: df
Out[337]: 
                2013      2014      2015
2013-01-31  0.705935  0.983307  0.714397
2013-05-31  0.492020  0.532103  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

我正在尝试根据索引中的年份将数据合并到新列中。例如“for row 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

有没有办法用if循环或其他方式整齐地自动化?

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

假设解析了日期,您可以这样做:

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

修改

这就是我想要的:

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

lookup方法为每个给定的行标签提供相应列标签的值。这个函数的速度更快(如果我将数据帧重新采样到每小时,第一个方法的时间约为3.5秒,而lookup方法在~20ms内完成)。

答案 1 :(得分: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