从 pandas groupby 对象返回每个组的子集

Returning subset of each group from a pandas groupby object

我的多级数据框如下所示:

                      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 的每一行检查列 value 的值,如果它是 False,删除它排。所以最终目标是删除 list 中的所有第一行,在 value 中有 False 我使用这段代码,这似乎符合逻辑:

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'

你能解释一下我的方法有什么问题吗?

你的一般方法——使用循环——很少能按照你想要的方式工作 pandas。

如果您有一个 groupby 对象,您应该使用 applyaggfiltertransform 方法。在你的情况下 apply 是合适的。

您的主要目标如下:

So the final goal is to delete all the first rows in (each group defined by ) list that have False in (the) value (column).

所以让我们编写一个简单的函数来在单个独立数据帧上执行此操作:

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