質問するログイン新規登録

回答編集履歴

1

回答を転記

2019/03/28 11:50

投稿

magichan
magichan

スコア15898

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