🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

Q&A

解決済

1回答

669閲覧

重複した値の列Aごとに列Bの累積和が0もしくはそのlength以上の行は削除したい。

sequelanonymous

総合スコア123

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

0グッド

0クリップ

投稿2019/09/15 10:16

編集2019/09/15 10:17

タイトルだとわかりづらいのでコードを記載します。
以下のように行を削除して加工後のデータにしたいです。
pandasで書く方法とpythonの二次元配列で書く方法をそれぞれ調べています。ご教示頂けませんでしょうか?

加工前のデータ

id correction 0 c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea False 1 c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea False 2 c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea False 3 c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea False 4 c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea False 5 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea True 6 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea False 7 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea True 8 c9dfa9de-e357-4d1d-834d-15b3d6bbd8ea True 9 c9dfa9de-e357-4d1d-834d-15b3d6bbd8ea True

加工後のデータ

id correction 5 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea True 6 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea False 7 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea True

やったこと:
pythonコード

python

1rc = results[['id', 'correction']] 2rc.loc[rc.groupby('id')['correction'].sum()]

結果

id correction 0.0 c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea False 2.0 c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea False ... ... ...

idが同じごとにcorrectionの部分の総和をだせばいいので上記のコードが正しいとおもっていましたが、なぜ同じidの行がでてしまい、不明のままです。

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

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

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

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

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

meg_

2019/09/15 10:29

全体のコードが分からないので、違うかもしれませんが、 rc.locの結果が上記の結果のようになっているのでしょう。 「rc.groupby('id')['correction'].sum()」の値はどうなっていますか?
sequelanonymous

2019/09/15 10:43

すみません、rc.locが原因でした。rc.groupby('id')['correction'].sum()の結果でよくよくみたらユニークになっていました。 ちなみに以下の書き方でも同じでしょうか?結果は同じように見えていますが。 rc.groupby('id').apply(lambda d: d['correction'].sum())
meg_

2019/09/15 12:10

データ列が「id」「correction」のみの場合は   rc.groupby('id').sum() で良いかと。 他の列もあるなら   rc.groupby('id')['correction'].sum() でしょうか。
sequelanonymous

2019/09/15 12:59

ありがとうございます。ちなみに今これをデータフレームを使わずに二次元配列としてデータを扱ってpandasとnumpyを使わずに書いています。 ``` from itertools import groupby from operator import itemgetter results_arrays = results.values.tolist() s = [(re[2], re[3]) for re in results_arrays] unique = set(s) この先がすすまない。。 ``` 今の所の結果 ``` {('00d3f265-ac37-4275-a410-e4d845e198de', False), ('015cce40-6a0a-4055-a64b-d98cd4f9645d', False), ('015cce40-6a0a-4055-a64b-d98cd4f9645d', True), ('02a69399-02a4-4ba1-bb3a-f0e7e9981e4f', False), ('02a69399-02a4-4ba1-bb3a-f0e7e9981e4f', True), ('02ad865b-ee87-4a41-bb22-adcbe16cf63a', False), ('02ad865b-ee87-4a41-bb22-adcbe16cf63a', True), ('02b6e303-fa1a-4403-8877-f2a77ce76f9e', False), ('02b6e303-fa1a-4403-8877-f2a77ce76f9e', True), ('045f28d2-75c7-44ca-ab46-8d35249aee70', False), ``` 出したい結果 ``` ('015cce40-6a0a-4055-a64b-d98cd4f9645d', False), ('015cce40-6a0a-4055-a64b-d98cd4f9645d', True), ('02a69399-02a4-4ba1-bb3a-f0e7e9981e4f', False), ('02a69399-02a4-4ba1-bb3a-f0e7e9981e4f', True), ('02ad865b-ee87-4a41-bb22-adcbe16cf63a', False), ('02ad865b-ee87-4a41-bb22-adcbe16cf63a', True), ('02b6e303-fa1a-4403-8877-f2a77ce76f9e', False), ('02b6e303-fa1a-4403-8877-f2a77ce76f9e', True), ``` なにかお気づきな点ありましたらご教示いただきたいです
meg_

2019/09/16 12:18

辞書を使ってみるのはどうでしょうか?
guest

回答1

0

ベストアンサー

今回のように、groupby() の結果を使って元のDataFrameをFilteringしたい場合は、groupby().apply() ではなく groupby().transform() を使うと良いかとおもいます。

タイトルのフィルタリングの条件を

correction列が全てTrue(df['correction'].all()) もしくは 全てFalse (not df['correction'].any())の列を削除する

と読み替えて実装すると

Python

1rc[rc.groupby('id')['correction'].transform(lambda d: (d.any()) & (not d.all()))]

で実現できるかと思います。
次に pandasを使わない方法ですが、key を id、valueを correctionリスト とした dict型のデータを作成した後に、上記の条件でフィルタリングするとよいかと思います。

ということで、以下に動作サンプルを書きましたので参考にしてください。

Python

1import pandas as pd 2import io 3 4data = """ 5,id,correction 60,c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea,False 71,c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea,False 82,c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea,False 93,c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea,False 104,c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea,False 115,a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea,True 126,a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea,False 137,a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea,True 148,c9dfa9de-e357-4d1d-834d-15b3d6bbd8ea,True 159,c9dfa9de-e357-4d1d-834d-15b3d6bbd8ea,True 16""" 17 18### PANDAS を使った例 ### 19rc = pd.read_csv(io.StringIO(data), index_col=0) 20ret = rc[rc.groupby('id')['correction'].transform(lambda d: (d.any()) & (not d.all()))] 21print(ret) 22# id correction 23#5 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea True 24#6 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea False 25#7 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea True 26 27 28### LIST を使った例 ### 29# データをList型に変換する 30arrays = rc.reset_index().values.tolist() 31# 重複を省いたUniqueなIDを求める 32ids = {row[1] for row in arrays} 33# データをidをkeyとしたdict型に変換 34dict_data = {id:[] for id in ids} 35for row in arrays: 36 dict_data[row[1]].append(row[2]) 37# {'c6dfa9de-e357-4d1d-834d-15b3d6bbd8ea': [False, False, False, False, False], 'a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea': [True, False, True], 'c9dfa9de-e357-4d1d-834d-15b3d6bbd8ea': [True, True]} 38# 条件に適合したIDを導く 39target_id = [id for id, d in dict_data.items() if (any(d)) and (not all(d))] 40# 結果表示 41for idx, id, correction in arrays: 42 if id in target_id: 43 print(idx, id, correction) 44#5 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea True 45#6 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea False 46#7 a8dfa9de-e357-4d1d-834d-15b3d6bbd8ea True

投稿2019/09/18 02:27

magichan

総合スコア15898

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問