2016-07-11 7 views
3

インデックスが所定の間隔にある行の合計値が少ない行を使用して、1つのデータフレームを別のdfにマップするにはどうすればよいですか?例えばパンダのデータフレーム圧縮

考えるDF:

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

(間隔の= 10):

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

は(間隔の= 5)

dfを希望

 Survived 
Age   
20   7 
30   3 
40   15 

答えて

1

あなたがgroupby引数に関数を使用することができます。これはまた、5で動作しますが、それはつまり、それはで埋めていない、空のグループであなたが望むように動作しません、

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

注意ゼロ!

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

私は最高の解決策を試していると思うと、出力が同じ場合は 'timedeltaindex'への変換がないので、' juanpa.arrivillaga'を使用してください。出力が異なる場合は、自分のソリューションを使用できると思います。 – 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

まずTimedeltaIndexintインデックスを変換し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:

それはあまりにも素敵な作品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

Ooo。 'Timedeltaindex'を使うのは良い考えでした。 –

+0

ありがとうございます。あなたのソリューションもいいですが、interval = 5のソリューションを追加することは可能ですか? – jezrael

+0

私は私の答えを編集しました。おそらくOPは結果を受け入れられると思うかもしれませんが、あなたのように要求された出力に正確に準拠していません。しかし、今、私はあなたがどのように公平になるのだろうかと思う年齢> 60 –