2

次のデータセットがあるとします

df_dict = ({'unit' : [1, 1, 1, 2, 2, 2], 'cat' : [1, 2, 3, 1, 2, 4], 
           'count' : [8, 3, 2, 2, 8, 7] })
df = pd.DataFrame(df_dict)

df.set_index('unit', inplace = True)

次のようになります。

    cat count
unit        
1    1   8
1    2   3
1    3   2
2    1   2
2    2   8
2    4   7

カウントは、ユニットで観測されたさまざまなカテゴリの頻度を示します。取得したいのは、各ユニットの 4 つのカテゴリの累積度数です。カテゴリ 4 はユニット 1 から欠落しており、カテゴリ 3 はユニット 2 から欠落していることに注意してください。

したがって、最終結果は次のようになります。

ユニット 1 の場合:

[8/13, 11/13, 13/13, 13/13]

ユニット 2 の場合:

[2/17, 10/17, 10/17, 17/17]

groupbyとを使用して累積合計を取得する方法は知っていますがcumsum、たとえば、ユニット 1 には、欠落しているカテゴリ 4 の値がありません。

御時間ありがとうございます!

4

1 に答える 1

3
import pandas as pd


df_dict = ({'unit' : [1, 1, 1, 2, 2, 2], 'cat' : [1, 2, 3, 1, 2, 4], 
           'count' : [8, 3, 2, 2, 8, 7] })
df = pd.DataFrame(df_dict)

df.set_index('unit', inplace = True)    

cumsum_count = df.groupby(level=0).apply(lambda x: pd.Series(x['count'].cumsum().values, index=x['cat']))
# unit  cat
# 1     1       8
#       2      11
#       3      13
# 2     1       2
#       2      10
#       4      17
# dtype: int64

cumsum_count = cumsum_count.unstack(level=1).fillna(method='ffill', axis=1)
# cat   1   2   3   4
# unit               
# 1     8  11  13  13
# 2     2  10  10  17

totals = df.groupby(level=0)['count'].sum()
# unit
# 1       13
# 2       17
# Name: count, dtype: int64

cumsum_dist = cumsum_count.div(totals, axis=0)
print(cumsum_dist)

収量

cat          1         2         3  4
unit                                 
1     0.615385  0.846154  1.000000  1
2     0.117647  0.588235  0.588235  1

この解決策を説明する方法が本当にわかりません。おそらく、偶然にたどり着いたからでしょう。インスピレーションは、ジェフのソリューションから来ました。

s.apply(lambda x: pd.Series(1, index=x))

値をインデックスに関連付けます。[8,11,13] などの累積カウント ( valuescat ) を [1,2,3] などの数値 ( index ) に関連付けると、基本的に家から解放されます。残りは、unstackfillnadiv、およびgroupbyの標準的なアプリケーションです。

于 2013-10-07T21:56:17.840 に答える