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,则删除该行。所以最终目标是删除 中的所有第一行list, 我使用这段代码,这似乎是逻辑Falsevalue

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

您的一般方法 - 使用循环 - 在 pandas 中很少按照您想要的方式工作。

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

您的主要目标如下:

所以最终的目标是删除(由 定义的每个组)list中所有False在(the)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 回答