2017-04-06 2 views
1

グループ化された特定のオブジェクトのヒストグラムを作成しようとしています。したがって、いくつかの文脈を与えるために、私はメインのデータフレームdfを持っており、私はそれをいくつかの値に基づいて照会し、それをdf_qに割り当てます。今度はdf_qを使って、私はこのグループidのインデックスを作成します。私が今したいのは、特定の列の各項目の値の数を取得することです。私が持っているので、場合:データフレームの指定された列にある各アイテムの値の数を取得し、インデックスを維持するにはどうすればよいですか?

In [128]: df_q 
Out[128]: 
     annual_base_delta_range_ten annual_base_delta_range_three 
row_id 
10010        3        5 
10010        5        11 
10010        6        15 
10010        5        11 
10010        5        11 
10010        5        12 
10010        6        14 
10010        6        16 
10010        4        9 
10010        4        9 

私は、各シリーズに、このような何かを行うことができることを知っている:

In [129]: df_q.annual_base_delta_range_ten.value_counts() 
Out[129]: 
5 4 
6 3 
4 2 
3 1 
Name: annual_base_delta_range_ten, dtype: int64 

しかし、私はのdf_q(すなわち、同じインデックスのように見えるのデータフレームを持っていると思いますrow_idと同じ列名と、2つの新しい値の列が追加されています)。

delta_ten | delta_10_count | delta_three | delta_three_count 
    3    1     5    1 
    4    2     9    2 
    5    4     11    3 

など...と同様に、すべて同じROW_IDと:ここ

編集

は私が見えるように私の望ましい結果を希望するものです。

答えて

1

元のデータフレームをそれぞれのvalue_countsシリーズとマージ(結合)するには、ソース列をマージキーとして使用します。

col = 'annual_base_delta_range_ten' 
df.merge(df[col].value_counts().to_frame('{}_value_counts'.format(col)), 
     left_on='annual_base_delta_range_ten', right_index=True) 
 annual_base_delta_range_ten annual_base_delta_range_three annual_base_delta_range_ten_value_counts 
row_id                          
10010        3        5           1 
10010        5        11           4 
10010        5        11           4 
10010        5        11           4 
10010        5        12           4 
10010        6        15           3 
10010        6        14           3 
10010        6        16           3 
10010        4        9           2 
10010        4        9           2 
+0

グレートを与える、私は、マージが行われる必要がありますが、私はちょうどそれを得ることができませんでした知っていました。ただもう1つの質問ですが、重複したアイテムを削除することをおすすめしますか?私は隣人(delta_range_three)を満たすためにもっと空の列を持っても構わないが、余分な数字はちょうどunpythonicに見える。 – Maksim

+0

@Maksim、申し訳ありませんが、分かりません。何を重複して言及していますか?質問データをサンプルデータの出力に更新できますか? –

+0

私が言及しているのは、同じ数の値が重複していることです。理想的には、それぞれの横に数えられたソートされた列を持つだけです。だから* _range_tenは3,4,5,6のいずれか1つしか持っていないはずです。隣の数の列に1,2,4,3があるはずです。 – Maksim

1

単純な答えではなく、ワンライナー、マップとvalue_counts()を使用します。 編集:@Igor Raushが示唆しているように、to_dictが必要でないように、マップにシリーズを渡すことができます。

val_count_ten = df.annual_base_delta_range_ten.value_counts() 
val_count_three = df.annual_base_delta_range_three.value_counts() 
df['val_count_ten'] = df.annual_base_delta_range_ten.map(val_count_ten) 
df['val_count_three'] = df.annual_base_delta_range_three.map(val_count_three) 

はあなたに

row_id annual_base_delta_range_ten annual_base_delta_range_three  val_count_ten val_count_three 
0 10010 3       5         1    1 
1 10010 5       11         4    3 
2 10010 6       15         3    1 
3 10010 5       11         4    3 
4 10010 5       11         4    3 
5 10010 5       12         4    1 
6 10010 6       14         3    1 
7 10010 6       16         3    1 
8 10010 4       9         2    2 
9 10010 4       9         2    2 
+0

すばらしい解決策。あなたは 'map()'に系列を渡すことができるので、 'to_dict()'は不要です。また、 'df.assign(val_count_ten = ...、val_count_three = ...)'はこれを(長い)1つのライナーに変えることができます。 –

+0

@Igor Raush、入力をありがとう。ええ、直接シリーズのマップを使用すると思っていません:) – Vaishali

+0

これはどのように動作するか説明できますか?また、to_dict()属性も何ですか?代わりに私自身のdictを使うことができますか? – Maksim

関連する問題