2016-07-11 87 views
3

如何映射一個數據幀到另一個DF與更少的行以給定的間隔相加行的值whoose指數是多少?熊貓據幀壓縮

例如

鑑於DF:

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

希望的DF

(對於間隔= 5):

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

(對於間隔= 10):

 Survived 
Age   
20   7 
30   3 
40   15 

回答

1

您可以使用函數爲groupby參數:

In [6]: df.groupby(lambda x: x//10 * 10).sum() 
Out[6]: 
    Survived 
20   7 
30   3 
40  15 

注意,這也適用於5,但它不工作,你想與空組的方式,也就是說,它不填寫零!

In [12]: df.groupby(lambda x: x//5 *5).sum() 
Out[12]: 
    Survived 
20   7 
30   3 
40  15 

但是,如果數據包含5間隔內這些組的值,則可以看到它正在工作。

In [18]: df 
Out[18]: 
    Survived 
Age   
20   1 
22   1 
23   3 
24   2 
26   99 
30   2 
33   1 
40   8 
42   7 
47   99 

In [19]: df.groupby(lambda x: x//5 *5).sum() 
Out[19]: 
    Survived 
20   7 
25  99 
30   3 
40  15 
45  99 
+0

@ОлегСериков你確定jezrael的解決方案不是你所需要的嗎? –

+0

我認爲最好的是嘗試兩種解決方案,如果輸出是相同的,使用'juanpa.arrivillaga'解決方案,因爲沒有轉換到'timedeltaindex'。如果產出不同,我認爲你可以使用我的解決方案。 – jezrael

0

您可以從列Age創建一個新列,然後使用GROUPBY:

爲了創建新列,Age需要採取列的索引:

df.reset_index(inplace = True) 


def cat_age(age): 
    return 10*int(age/10.) 

df['category_age'] = df.Age.apply(lambda x: cat_age(x)) 
df.groupby('category_age',as_index = False).agg({'Survived':sum}) 

輸出:

category_age Survived 
0 20    7 
1 30    3 
2 40    15 

當然,如果你想改變的類別,你可以通過間隔cat_age

def cat_age(age,interval) 
    return interval*int(1.*age/interval) 
1

首先轉換int指數TimedeltaIndex然後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 

編輯:

如果Age> 60它的作品太好了:

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 
+1

噢噢。使用'Timedeltaindex'是個好主意。 –

+0

謝謝。你的解決方案也很好,但是可能爲interval = 5添加解決方案嗎? – jezrael

+0

我編輯了我的答案。也許OP會發現結果可以接受,但像你這樣做,他們不完全符合要求的輸出。雖然,現在我不知道你怎麼會公平時年齡> 60 –