如何复制不存在递增列值的行和递增列?

时间:2019-06-14 23:58:12

标签: python pandas dataframe

我有一个这样的熊猫数据框:

id     alt    amount
6      b      30
6      a      30
3      d      56
3      a      40
1      c      35
1      b      10
1      a      20

我想变成这样:

id     alt    amount
6      d      56
6      c      35
6      b      30
6      a      30
5      d      56
5      c      35
5      b      26
5      a      33.33
4      d      56
4      c      35
4      b      22
4      a      36.66
3      d      56
3      c      35
3      b      18
3      a      40
2      c      35
2      b      14
2      a      30
1      c      35
1      b      10
1      a      20

对于每个小于最大ID号的丢失ID号N,应复制小于N的最大ID号的所有alt值,对于这些重复的行,将id号设置为N。如果对更大的id编号重复alt值,则附加项输入应增加除以id值之间的差(步数)。如果不重复alt值,则可以简单地复制该数量为每个附加ID值结束。

例如,出现一个ID为1、3和6的ID,数量分别为20、40、30。我们需要添加一个id为2的a实例。该数量为30,因为从1到3需要2步,而我们要增加20。从3到6则有3步,我们将减少10。-10/3 = -3.33,因此我们为a的每个新实例减去3.33。

我想将复制,排序和正向填充进行某种组合?我不确定这里的逻辑。

1 个答案:

答案 0 :(得分:1)

您可以先使用pivot + reindex然后使用interpolate

yourdf=df.pivot(*df.columns).\
    reindex(range(df.id.min(),df.id.max()+1)).\
     interpolate(method='index').stack().reset_index()
yourdf
Out[51]: 
    id alt          0
0    1   a  20.000000
1    1   b  10.000000
2    1   c  35.000000
3    2   a  30.000000
4    2   b  14.000000
5    2   c  35.000000
6    3   a  40.000000
7    3   b  18.000000
8    3   c  35.000000
9    3   d  56.000000
10   4   a  36.666667
11   4   b  22.000000
12   4   c  35.000000
13   4   d  56.000000
14   5   a  33.333333
15   5   b  26.000000
16   5   c  35.000000
17   5   d  56.000000
18   6   a  30.000000
19   6   b  30.000000
20   6   c  35.000000
21   6   d  56.000000