为 pandas 数据框的每个 id 替换列中序列的缺失值

我有一个数据集:


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  value

0   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  value

0   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=0

for 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

但是这段代码不起作用。


我该怎么做呢?


FFIVE
浏览 149回答 3
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]]请注意,您应该分配一个包含所需列表的单元素列表。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python