迭代pandas中的行来检查条件

Pin*_*use 7 python dataframe pandas

我在熊猫中有以下DF.

+-------+-------+
| Col_A | Col_B |
+-------+-------+
|  1234 |       |
|  6267 |       |
|  6364 |       |
|   573 |       |
|     0 |       |
|   838 |       |
|    92 |       |
|  3221 |       |
+-------+-------+
Run Code Online (Sandbox Code Playgroud)

Col_B应该填充True或False值.默认情况下,它是False,但是当第一个0被"看到"时,DF的其余部分应为True.DF有超过10万行.

由于Col_A中的第一个"0"值出现,因此将col_B中的值设置为"True"的最快方法是什么?

+-------+--------+
| Col_A | Col_B  |
+-------+--------+
|  1234 | False  |
|  6267 | False  |
|  6364 | False  |
|   573 | False  |
|     0 | True   |
|   838 | True   |
|    92 | True   |
|  3221 | True   |
+-------+--------+
Run Code Online (Sandbox Code Playgroud)

use*_*203 5

使用idxmaxloc用于分配

idx = df.Col_A.eq(0).idxmax()
df['Col_B'] = False
df.loc[idx:, 'Col_B'] = True
Run Code Online (Sandbox Code Playgroud)

   Col_A  Col_B
0   1234  False
1   6267  False
2   6364  False
3    573  False
4      0   True
5    838   True
6     92   True
7   3221   True
Run Code Online (Sandbox Code Playgroud)

使用assign:

此方法可避免修改原始DataFrame.

df.assign(Col_B=(df.index >= idx))
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 5

使用eqcummax

df.A.eq(0).cummax()
Out[5]: 
0    False
1    False
2    False
3    False
4     True
5     True
6     True
7     True
Name: A, dtype: bool
Run Code Online (Sandbox Code Playgroud)


piR*_*red 5

你可以使用Numpy的ufunc accumulate方法logical_or

df.assign(Col_B=np.logical_or.accumulate(df.Col_A.values == 0))

   Col_A  Col_B
0   1234  False
1   6267  False
2   6364  False
3    573  False
4      0   True
5    838   True
6     92   True
7   3221   True
Run Code Online (Sandbox Code Playgroud)


jpp*_*jpp 4

您可以next与生成器表达式一起使用。对于0出现在开头附近的大系列,这会更有效。

@user3483203 的基于 NumPy 的解决方案应该适合一般用途。

df = pd.DataFrame({'A': [1234, 6267, 6364, 573, 0, 838, 92, 3221]})

idx = next((i for i, j in enumerate(df['A']) if j == 0), len(df['A']))

df['B'] = ~(df.index < idx)

# more verbose alternative:
# df['B'] = np.where(df.index < idx, False, True)

print(df)

      A      B
0  1234  False
1  6267  False
2  6364  False
3   573  False
4     0   True
5   838   True
6    92   True
7  3221   True
Run Code Online (Sandbox Code Playgroud)