質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

1489閲覧

pandasでの集計方法について

xxyyxx

総合スコア40

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2019/03/18 05:20

pandas(python3)を使って、あるcsvファイルからデータを読み込み、
そのデータを編集して標準出力できたらと思っています。

・csvファイル
レコード数150〜300
カラム2

domainvalue
1aaa.xxx.co.jp500.12
2bbb.aaa.co.jp300.44
3ccc.xxx.co.jp30.22
4ddd.bbb.co.jp120.45
5eee.ccc.co.jp20.19

と、大体元となるデータはこんなイメージです。
domainはすべてユニークなのですが、上の表で"xxx"を含むdomainのvalueを足して集計したいです。
まとめたときに、domainの名前はできればリネームしたいです。

domainvalue
1xxx530.34
2bbb.aaa.co.jp300.44
3ddd.bbb.co.jp120.45
4eee.ccc.co.jp20.19

調べながらコードをかいているのですが、今回のような場合、どのような集計がシンプルにコードが収まるのでしょうか?
現状として、

DUPLICATE = ['xxx', 'yyy'] # csv読込 df = pd.read_csv('sample.csv') # 一旦、DUPLICATEにある文字列を含んでいるレコード(domain)をリネームしたい for n in DUPLICATE: for d in df['domain']: if n in d: df.at[d, 'domain'] = n

こんなところで止まってしまいました。
この出力では、リネームはされますが、元データの追加でindexがdomainで付与されて出力されました。
このコードを書いている時は、特定の単語が含まれているdomainを1つのレコードにまとめ(関数1)、valueを足す(関数2)で考えていました。

上記のようなデータを集計したい場合のもっと効率のよい考え方やコードの一例を可能でしたらご回答頂けたらと思います。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

これでどうでしょうか?

Python

1import pandas as pd 2 3df = pd.DataFrame({ 4 'domain':["aaa.xxx.co.jp","bbb.aaa.co.jp","ccc.xxx.co.jp","ddd.bbb.co.jp","eee.ccc.co.jp"], 5 'value':[500.12, 300.44, 30.22, 120.45, 20.19]}) 6 7 8# 'domain列に'特定の単語が含まれている場合リネームする 9DUPLICATE = ['xxx', 'yyy'] 10for n in DUPLICATE: 11 df.loc[df.domain.str.contains(n), 'domain'] = n 12# 'domain'列にて同じ名前のものはまとめて合計を求める 13ret = df.groupby('domain').sum().reset_index()

投稿2019/03/18 05:47

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

無理やり簡潔にしたバージョン

Python

1df=pd.DataFrame({"domain":["xxx","xxx.ssss","aaa","bbbb","ffff"],"value":[530,10,400,12,1222]}) 2DUPLICATE = ['xxx', 'yyy'] 3answer={i:df[df['domain'].str.contains('xxx')]["value"].sum(axis=0) for i in DUPLICATE}

投稿2019/03/18 06:02

yamato_user

総合スコア2321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xxyyxx

2019/03/18 08:22

ありがとうございました!参考にさせていただきます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問