基于另一列的多指数熊猫数据框架创建新列



我在Windows上运行Python 3.5,并编写代码来研究Financial Enatorics。

我有一个多索引熊猫数据框,其中级别= 0索引是一系列月末期,级别= 1索引是一个简单的整数ID。我想创建一个新的值('new_var')的新列,其中每个月结束日期,我期待1个月,并从另一列('some_var')中获取值,当然还有本月的IDS要与周期月的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

我将创建一个代表日期的整数列,将其从中缩成一个月(将其移动一个月),然后将剩余的值合并回原始dataframe。

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

最新更新