从 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
对象,您应该使用 apply
、agg
、filter
或 transform
方法。在你的情况下 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
我的多级数据框如下所示:
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
对象,您应该使用 apply
、agg
、filter
或 transform
方法。在你的情况下 apply
是合适的。
您的主要目标如下:
So the final goal is to delete all the first rows in (each group defined by )
list
that haveFalse
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