回答編集履歴

1

回答を転記

2019/03/28 11:50

投稿

magichan
magichan

スコア15898

test CHANGED
@@ -1,11 +1,63 @@
1
- すみません
2
-
3
- こちらの質問に気づかずに
4
-
5
1
  [http://teratail.com/questions/181382](https://teratail.com/questions/181382)
6
2
 
3
+ にも書いておりますが、まず 国、銘柄毎に point,price 列の最大・平均.最小の値を求める方法は ``Groupby.agg()`` を使って
4
+
5
+ ```Python
6
+
7
+ df.groupby(['country','variety']).agg({'price':['min','mean','max'], 'points':['min','mean','max']})
8
+
9
+ ```
10
+
7
- コメント回答してしまいましたのでこちらを参照ください、
11
+ となり、これと同時に description数をカウントするため
8
12
 
9
13
 
10
14
 
15
+ ```Python
16
+
17
+ tmp_df = df.groupby(['country','variety']).agg({'price':['min','mean','max'], 'points':['min','mean','max'],'description':'count'})
18
+
19
+ ```
20
+
21
+
22
+
23
+ とでもすると良いわけです。
24
+
25
+
26
+
11
- > から質問閲覧る方もおられるかますの、あとでこちらにも正式に回答を転記したいと思いますがとりあえず。
27
+ あとは上記の DataFrame から 国ごとに description 数が最大な行抜き出すとわけですが
28
+
29
+ これは上記のデータフレーム(``tmp_df``) に対して再度、国ごとに groupby() を使って行うことができます。
30
+
31
+
32
+
33
+ 具体的なコードをわかりやすく for文を使って書くと
34
+
35
+
36
+
37
+ ```Python
38
+
39
+ # 国毎に選択された銘柄の行を格納するリスト
40
+
41
+ dfs = []
42
+
43
+ # groupby() によって国毎のデータでループ
44
+
45
+ for country, data in tmp_df.groupby('country'):
46
+
47
+ # description数が最大な行のIndexを求める
48
+
49
+ idx = data[('description','count')].idxmax()
50
+
51
+ # 上の行をリストに格納
52
+
53
+ dfs.append(tmp_df.loc[[idx]])
54
+
55
+ # リスト内のデータを結合してデータフレームを再構築
56
+
57
+ result = pd.concat(dfs)
58
+
59
+ ```
60
+
61
+
62
+
63
+ となるかと思います。