Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pandas dataframe compression

Tags:

python

pandas

How do I map one dataframe into another df with less number of rows summing values of rows whoose indices are in given interval?

For example

Given df:

      Survived
Age           
20           1
22           1
23           3
24           2
30           2
33           1
40           8
42           7

Desired df

(for interval = 5):

      Survived
Age           
20           7
25           0
30           3
35           0
40           15

(for interval = 10):

      Survived
Age           
20           7
30           3
40           15
like image 445
Олег Сериков Avatar asked May 30 '26 14:05

Олег Сериков


1 Answers

First convert int index to TimedeltaIndex and then resample:

df.index = pd.TimedeltaIndex(df.index.to_series(), unit='s')
print (df)
          Survived
00:00:20         1
00:00:22         1
00:00:23         3
00:00:24         2
00:00:30         2
00:00:33         1
00:00:40         8
00:00:42         7

df1 = df.resample('5S').sum().fillna(0)
df1.index = df1.index.seconds
print (df1)
    Survived
20       7.0
25       0.0
30       3.0
35       0.0
40      15.0

df2 = df.resample('10S').sum().fillna(0)
df2.index = df2.index.seconds
print (df2)
    Survived
20         7
30         3
40        15

EDIT:

If Age > 60 it works nice too:

print (df)
     Survived
Age          
20          1
22          1
23          3
24          2
30          2
33          1
40          8
42          7
60          8
62          7
70          8
72          7
df.index = pd.TimedeltaIndex(df.index.to_series(), unit='s')

df1 = df.resample('5S').sum().fillna(0)
df1.index = df1.index.seconds
print (df1)
    Survived
20       7.0
25       0.0
30       3.0
35       0.0
40      15.0
45       0.0
50       0.0
55       0.0
60      15.0
65       0.0
70      15.0

df2 = df.resample('10S').sum().fillna(0)
df2.index = df2.index.seconds
print (df2)
    Survived
20       7.0
30       3.0
40      15.0
50       0.0
60      15.0
70      15.0
like image 120
jezrael Avatar answered Jun 02 '26 03:06

jezrael