2

次のようなマルチレベルのデータフレームがあります。

                      date_time      name  note   value
list index                                    
1    0     2015-05-22 05:37:59       Tom   129    False
     1     2015-05-22 05:38:59       Tom     0    True
     2     2015-05-22 05:39:59       Tom     0    False
     3     2015-05-22 05:40:59       Tom    45    True
2    4     2015-05-22 05:37:59       Kate   129    True
     5     2015-05-22 05:41:59       Kate     0    False
     5     2015-05-22 05:37:59       Kate     0    True

を反復処理し、list最初の行ごとlistに column の値をチェックし、valueそうであればFalse、この行を削除します。したがって、最終的な目標は、の最初の行をすべて削除する ことです。これは、ロジックのように見えるこのコードを使用していますlistFalsevalue

def delete_first_false():
    for list, new_df in df.groupby(level=0):
        for index, row in new_df.iterrows():
            new_df=new_df.groupby('name').first().loc([new_df['value']!='False'])
        return new_df
    return df

しかし、私はこのエラーがあります

AttributeError: '_LocIndexer' object has no attribute 'groupby'

私の方法の何が問題なのか説明してもらえますか?

4

1 に答える 1

4

ループを使用する一般的なアプローチは、パンダで思い通りに機能することはめったにありません。

groupbyオブジェクトがある場合はapply、、、またはメソッドaggを使用する必要があります。あなたの場合は適切です。filtertransformapply

あなたの主な目標は次のとおりです。

したがって、最終的な目標は、(列) にある ( で定義される各グループ) の最初の行をすべて削除するlistことFalseですvalue

それでは、単一のスタンドアロンのデータフレームでそれを行う単純な関数を書きましょう。

def filter_firstrow_falses(df):
    if not df['value'].iloc[0]:
        return df.iloc[1:]
    else:
        return df

わかった。十分に単純です。

それでは、apply実際のデータフレームの各グループについて説明しましょう。

import pandas
from io import StringIO

csv = StringIO("""\
list,date_time,name,note,value
1,2015-05-22 05:37:59,Tom,129,False
1,2015-05-22 05:38:59,Tom,0,True
1,2015-05-22 05:39:59,Tom,0,False
1,2015-05-22 05:40:59,Tom,45,True
2,2015-05-22 05:37:59,Kate,129,True
2,2015-05-22 05:41:59,Kate,0,False
2,2015-05-22 05:37:59,Kate,0,True
""")

df = pandas.read_csv(csv)

final = (
    df.groupby(by=['list']) # create the groupby object
      .apply(filter_firstrow_falses) # apply our function to each group
      .reset_index(drop=True) # clean up the index
)
print(final)


   list            date_time  name  note  value
0     1  2015-05-22 05:38:59   Tom     0   True
1     1  2015-05-22 05:39:59   Tom     0  False
2     1  2015-05-22 05:40:59   Tom    45   True
3     2  2015-05-22 05:37:59  Kate   129   True
4     2  2015-05-22 05:41:59  Kate     0  False
5     2  2015-05-22 05:37:59  Kate     0   True
于 2015-11-03T17:49:03.697 に答える