使用Python填充面板数据中的空白

使用Python填充面板数据中的空白,python,pandas,Python,Pandas,考虑一个不平衡的面板,其间隙具有信息性(例如,真零)。我 要将零添加回中。从本质上讲,我正在尝试用pandas重新创建stata函数的功能 示例数据(我构建了一个平衡面板,并删除了一些观察结果): 使面板再次平衡的一种方法是将不平衡的面板合并到具有平衡id和日期列的数据框中: # construct one full set of dates for everyone all_dates = pd.DataFrame(pd.date_range(unbalanced_data['date'].m

考虑一个不平衡的面板,其间隙具有信息性(例如,真零)。我 要将零添加回中。从本质上讲,我正在尝试用pandas重新创建stata函数的功能

示例数据(我构建了一个平衡面板,并删除了一些观察结果):

使面板再次平衡的一种方法是将不平衡的面板合并到具有平衡id和日期列的数据框中:

# construct one full set of dates for everyone
all_dates = pd.DataFrame(pd.date_range(unbalanced_data['date'].min(),unbalanced_data['date'].max()),columns=['date'])

length = unbalanced_data['id'].unique().size
all_dates_full=all_dates
for x in range(length-1):
    all_dates_full=all_dates_full.append(all_dates)

all_dates_full.reset_index(inplace=True,drop=True)

# duplicate ids to match the number of dates 
length = all_dates.size
ids=unbalanced_data['id'].drop_duplicates()
ids_full=ids
for x in range(length-1):
    ids_full=ids_full.append(ids)

ids_full.sort_values(inplace=True)
ids_full.reset_index(inplace=True,drop=True)

balanced_panel = pd.concat([all_dates_full,ids_full],axis=1)

rebalanced_data=pd.merge(balanced_panel,unbalanced_data,how='left',on=['id','date'])
rebalanced_data.fillna(False,inplace=True)

# check
balanced_data==rebalanced_data
除了笨重之外,我发现当N变大时,这种方法的速度非常慢。我想一定有更有效的方法来重新平衡面板,但我找不到


(PS这是我关于stackoverflow的第一个问题,因此非常感谢对未来问题的任何建设性批评!)

就性能而言,与附加列表相比,在pandas中附加数据帧是一个缓慢的操作。索引是不可变的,因此每次追加时都会创建一个新索引。这里有一个解决方案,它在pandas之外构建集合,然后将它们连接到一个数据帧中

uid = unbalanced_data['id'].unique()
ids_full = np.array([[x]*len(all_dates) for x in range(len(uid))]).flatten()
dates = all_dates['date'].tolist() * len(uid)
balanced_panel = pd.DataFrame({'id': ids_full, 'date': dates})
rebalanced_data = pd.merge(balanced_panel, unbalanced_data, how=‌​'left',
                           on=['id', 'dat‌​e']).fillna(False)

谢谢您的方法效率更高,但需要对平衡和不平衡数据具有相同的索引位置。例如。如果我在不平衡的_数据上重置索引——不平衡的_数据=平衡的_数据[balanced_data['random']==1]。重置_索引()——则“先合并_”的方法不起作用。有什么办法可以解决这个问题吗?重新平衡的数据=pd.merge(平衡的数据面板,不平衡的数据,how='left',on=['id','date'])。fillna(False)在这种情况下最好吗?我认为我的代码中的主要低效问题似乎可以通过您的前4行来解决,所以再次感谢您!您是对的,索引需要对齐,因此合并是更好的选择。我更新了帖子以反映这一点。
uid = unbalanced_data['id'].unique()
ids_full = np.array([[x]*len(all_dates) for x in range(len(uid))]).flatten()
dates = all_dates['date'].tolist() * len(uid)
balanced_panel = pd.DataFrame({'id': ids_full, 'date': dates})
rebalanced_data = pd.merge(balanced_panel, unbalanced_data, how=‌​'left',
                           on=['id', 'dat‌​e']).fillna(False)