我有一个像这样的数据框
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循环或其他方式整齐地自动化?
感谢您的帮助!
答案 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