Pandas -开始迭代索引并使用.loc进行切片



我对Python和编程还是个新手。幸运的是,我有一个正确的想法,但我不能完全使这个工作。

在我的例子df中,我希望迭代开始于entry == 1.

import pandas as pd
import numpy as np
nan = np.nan
a = [0,0,4,4,4,4,6,6]
b = [4,4,4,4,4,4,4,4]
entry = [nan,nan,nan,nan,1,nan,nan,nan]
df = pd.DataFrame(columns=['a', 'b', 'entry'])
df = pd.DataFrame.assign(df, a=a, b=b, entry=entry)

我写了一个函数,几乎没有成功。它返回一个错误,不可哈希类型:'slice'。顺便说一下,我将这个函数应用于不同长度的组。

def exit_row(df):
start = df.index[df.entry == 1]
df.loc[start:,(df.a > df.b), 'exit'] = 1
return df
理想情况下,结果如下:
a   b   entry  exit
0   0   4   NaN   NaN
1   0   4   NaN   NaN 
2   4   4   NaN   NaN 
3   4   4   NaN   NaN 
4   4   4   1.0   NaN 
5   4   4   NaN   NaN 
6   6   4   NaN    1
7   6   4   NaN    1

任何建议都非常感谢。我曾想过是否应该尝试使用For循环,尽管我经常发现它们很难阅读。

可以使用布尔索引:

# what are the rows after entry?
m1 = df['entry'].notna().cummax()
# in which rows is a>b?
m2 = df['a'].gt(df['b'])
# set 1 where both conditions are True
df.loc[m1&m2, 'exit'] = 1

输出:

a  b  entry  exit
0  0  4    NaN   NaN
1  0  4    NaN   NaN
2  4  4    NaN   NaN
3  4  4    NaN   NaN
4  4  4    1.0   NaN
5  4  4    NaN   NaN
6  6  4    NaN   1.0
7  6  4    NaN   1.0

中间体:

a  b  entry  notna     m1     m2  m1&m2  exit
0  0  4    NaN  False  False  False  False   NaN
1  0  4    NaN  False  False  False  False   NaN
2  4  4    NaN  False  False  False  False   NaN
3  4  4    NaN  False  False  False  False   NaN
4  4  4    1.0   True   True  False  False   NaN
5  4  4    NaN  False   True  False  False   NaN
6  6  4    NaN  False   True   True   True   1.0
7  6  4    NaN  False   True   True   True   1.0

最新更新