为多索引 Panda 数据框创建基于另一列的新列
Posted
技术标签:
【中文标题】为多索引 Panda 数据框创建基于另一列的新列【英文标题】:Create new column based on another column for a multi-index Panda dataframe 【发布时间】:2018-02-14 07:41:37 【问题描述】:我在 Windows 上运行 Python 3.5 并编写代码来研究金融计量经济学。
我有一个多索引熊猫数据框,其中 level=0 索引是一系列月末日期,而 level=1 索引是一个简单的整数 ID。我想创建一个新的值列('new_var'),对于每个月末日期,我期待 1 个月并从另一列('some_var')获取值,当然还有当月需要的 ID与前一个月的 ID 对齐。这是一个简单的测试用例。
import pandas as pd
import numpy as np
# Create some time series data
id = np.arange(0,5)
date = [pd.datetime(2017,1,31)+pd.offsets.MonthEnd(i) for i in [0,1]]
my_data = []
for d in date:
for i in id:
my_data.append((d, i, np.random.random()))
df = pd.DataFrame(my_data, columns=['date', 'id', 'some_var'])
df['new_var'] = np.nan
df.set_index(['date', 'id'], inplace=True)
# Drop an observation to reflect my true data
df.drop(('2017-02-28',3), level=None, inplace=True)
df
# The desired output....
list1 = df.loc['2017-01-31'].index.labels[1].tolist()
list2 = df.loc['2017-02-28'].index.labels[1].tolist()
common = list(set(list1) & set(list2))
for i in common:
df.loc[('2017-01-31', i)]['new_var'] = df.loc[('2017-02-28', i)]['some_var']
df
我觉得有更好的方法来获得我想要的输出。也许我应该拥抱“for”循环?也许更好的解决方案是重置索引?
谢谢,
F
【问题讨论】:
【参考方案1】:我将创建一个表示日期的整数列,其中的底物之一(将其移动一个月)并将剩下的值合并回原始数据框。
Out[28]:
some_var
date id
2017-01-31 0 0.736003
1 0.248275
2 0.844170
3 0.671364
4 0.034331
2017-02-28 0 0.051586
1 0.894579
2 0.136740
4 0.902409
df = df.reset_index()
df['n_group'] = df.groupby('date').ngroup()
df_shifted = df[['n_group', 'some_var','id']].rename(columns='some_var':'new_var')
df_shifted['n_group'] = df_shifted['n_group']-1
df = df.merge(df_shifted, on=['n_group','id'], how='left')
df = df.set_index(['date','id']).drop('n_group', axis=1)
Out[31]:
some_var new_var
date id
2017-01-31 0 0.736003 0.051586
1 0.248275 0.894579
2 0.844170 0.136740
3 0.671364 NaN
4 0.034331 0.902409
2017-02-28 0 0.051586 NaN
1 0.894579 NaN
2 0.136740 NaN
4 0.902409 NaN
【讨论】:
有效并且看起来非常有效。谢谢。以上是关于为多索引 Panda 数据框创建基于另一列的新列的主要内容,如果未能解决你的问题,请参考以下文章