endo_mame
@endo_mame

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

階段状の集計

解決したいこと

超初心者で申し訳ございません、pythonで会員毎の残存年数のリストを、年齢ごとに階段状に集計したいです。

例)
会員 加入年齢 残存1年目 2年目 3年目
aさん 28 1 1 0.5
bさん 25 1 1 0
cさん 23 1 1 1
というcsvの会員リストを、年齢別に集計したいと考えています。
集計の年齢は加入時から毎年上がっていくものとしたく、単に加入時年齢のgroupbyでは出すことができないため、悩んでいます。。
例えばaさんの場合、
年齢 残存1年目 2年目 3年目
28 1 0 0
29 0 1 0
30 0 0 0.5
という形になり、同様にリストの全員分を積み上げていきたいと考えています。

0

3Answer

加入1年目、2年目、3年目
加入1年、2年、3年 は許容されますが、

残存1年目 2年目 3年目
残存1年 2年 3年 の場合、後者のみ許容されます。(最も残存3年 2年 1年が正しい) 

   age(1)   2   3   4
会員,加入年齢,残存1年,2年,3年
a,   28,      1,   1,  1
b,   25,      1,   1,  0
c,   23,      1,   1,  1

0.5は主題をぼかすため1に変更した。

年齢, 残存1年, 2年, 3年
23,     1,   0,   0
24,     0,   1,   0
25,     1,   0,   1
26,     0,   1,   0
28,     1,   0,   0
29,     0,   1,   0
30,     0,   0,   1

27歳は存在しない。

Array[年齢, 残存年]の配列に単純加算すればよいのでは?aさんの残存2年の歳は28+3-2の29で求められます。

そもそも、加入年、生年月日、退会満了年を持ちず,相対的な数値である年齢を持ちている時点で、データ処理の基礎の理解不足が伺えます。

2Like

失礼ながら、はっきり言わせていただけると、何がしたいのかが日本語レベルで分かりません。

「残存年数」って何ですか? 会員になってからの継続年数のこと?

「残存x年目」の 1 とか 0 とか 0.5 とかいう数字は何なのですか?

「例えばaさんの場合」の例でどういう計算をするとそういう結果になるのでしょうか? 自分は全く理解不能なのですが・・・

1Like

少しパワープレイな感じで非効率な処理かもしれないですが、
以下のような形でやりたいことは実現できそうです。

from collections import defaultdict

d = defaultdict(int)

list_member = [['a',28,1,1,0.5],['b',25,1,1,0],['c',23,1,1,1],['d',24,10,20,30]]

for l in list_member:
    base_age = l[1]
    d[base_age] += l[2]
    d[base_age+1] += l[3]
    d[base_age+2] += l[4]

for i in sorted(d.items()):
    print(i)
出力
(23, 1)
(24, 11)
(25, 22)
(26, 31)
(27, 0)
(28, 1)
(29, 1)
(30, 0.5)
1Like

Your answer might help someone💌