我有一个数据集:dt = {'id': [120,120,120,120,120,121,121,345], 'day': [0, 1,2,3,4,0,2,0], 'value': [[0.3,-0.5,-0.7],[0.5,3.4,2.7],[0.45,3.4,0.7],[0.25,0.4,0.7],[0.15,0.34,0.17],[0.35,3.4,2.7],[0.5,3.44,2.57],[0.5,0.34,0.37]]}df = pd.DataFrame(data=dt) day id value0 0 120 [0.3, -0.5, -0.7]1 1 120 [0.5, 3.4, 2.7]2 2 120 [0.45, 3.4, 0.7]3 3 120 [0.25, 0.4, 0.7]4 4 120 [0.15, 0.34, 0.17]5 0 121 [0.35, 3.4, 2.7]6 2 121 [0.5, 3.44, 2.57]7 0 345 [0.5, 0.34, 0.37]对于每个ID,应该有一个从0到5的天序列。在我的列ID数据集中,缺少了几天。我想为这些ID添加缺少的天数,并为相应的“值”列添加零数组。结果: day id value0 0 120 [0.3, -0.5, -0.7]1 1 120 [0.5, 3.4, 2.7]2 2 120 [0.45, 3.4, 0.7]3 3 120 [0.25, 0.4, 0.7]4 4 120 [0.15, 0.34, 0.17]5 0 121 [0.35, 3.4, 2.7]6 1 121 [0, 0, 0]7 2 121 [0.5, 3.44, 2.57]8 3 121 [0, 0, 0]9 4 121 [0, 0, 0]10 0 345 [0.5, 0.34, 0.37]11 1 345 [0, 0, 0]12 2 345 [0, 0, 0]13 3 345 [0, 0, 0]14 4 345 [0, 0, 0]这是样本空间。我将在一个巨大的数据集上做这个。我的尝试: r1=0for i in df.id.unique(): val=df.loc[df['id'] == i] mx=val.loc[val['day'].idxmax()].day for index,row in val.iterrows(): if row.day!=r1: for k in range(int(row.day)-r1-1): a.append(np.asarray([0]*3)) r1=row.day else: a.append(row.value) if(row.day==mx): a.append(row.value) for j in range(4-mx): a.append(np.asarray([0]*3))) r1=r1+1但是这段代码不起作用。我该怎么做呢?
3 回答
蛊毒传说
TA贡献1895条经验 获得超3个赞
我假设每天(0到4)在数据框中的某个位置至少被提及一次。
使id和day为MultiIndex(set_index
),然后将数据帧转换为表(unstack
)。会有缺失值(某些 id 的缺失天数),将它们设置为零 ( fillna
)。然后将表转换回向量(stack
),并将索引转换回列(reset_index
)。
df1 = df.set_index(['id', 'day']).unstack().fillna(0)\ .stack().reset_index().astype(object)
数据框必须转换为 type object
,否则将列表分配给列将不起作用。现在,将0替换为您选择的列表:
df1.loc[df1['value'] == 0, 'value'] = [[0, 0, 0]]
请注意,您应该分配一个包含所需列表的单元素列表。
添加回答
举报
0/150
提交
取消