如何"熨平"其中包含重复数字的一列数字

时间:2017-03-22 10:21:05

标签: python pandas dataframe

如果有以下列:

df = pd.DataFrame({"numbers":[1,2,3,4,4,5,1,2,2,3,4,5,6,7,7,8,1,1,2,2,3,4,5,6,6,7]})

一个人怎么能铁?#34;将它复制成一系列数字的一部分:

numbers  new_numbers
1        1
2        2 
3        3 
4        4
4        5 
5        6 

1        1
2        2 
2        3 
3        4
4        5 
5        6
6        7
7        8 
7        9     
8        10

1        1 
1        2  
2        3
2        4 
3        5 
4        6
5        7 
6        8
6        9
7        10

(我把空格放入df以便澄清)

1 个答案:

答案 0 :(得分:1)

您需要Series <创建cumcount,并与diff#for better testing helper df1 df1 = pd.DataFrame(index=df.index) df1['dif'] = df.numbers.diff() df1['compare'] = df.numbers.diff().lt(0) df1['groups'] = df.numbers.diff().lt(0).cumsum() print (df1) dif compare groups 0 NaN False 0 1 1.0 False 0 2 1.0 False 0 3 1.0 False 0 4 0.0 False 0 5 1.0 False 0 6 -4.0 True 1 7 1.0 False 1 8 0.0 False 1 9 1.0 False 1 10 1.0 False 1 11 1.0 False 1 12 1.0 False 1 13 1.0 False 1 14 0.0 False 1 15 1.0 False 1 16 -7.0 True 2 17 0.0 False 2 18 1.0 False 2 19 0.0 False 2 20 1.0 False 2 21 1.0 False 2 22 1.0 False 2 23 1.0 False 2 24 0.0 False 2 25 1.0 False 2 )进行比较,以查找每个群组的开头数。小组由lt制作:

df['new_numbers'] = df.groupby(df.numbers.diff().lt(0).cumsum()).cumcount() + 1
print (df)
    numbers  new_numbers
0         1            1
1         2            2
2         3            3
3         4            4
4         4            5
5         5            6
6         1            1
7         2            2
8         2            3
9         3            4
10        4            5
11        5            6
12        6            7
13        7            8
14        7            9
15        8           10
16        1            1
17        1            2
18        2            3
19        2            4
20        3            5
21        4            6
22        5            7
23        6            8
24        6            9
25        7           10
for (var i = 1; i <= 100; i++)
{
    Console.Write(i);
    Console.Write(i % 10 == 0 ? Environment.NewLine : ",");
}