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)
idxmax与loc用于分配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)
使用eq与cummax
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)
你可以使用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)
您可以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)
| 归档时间: |
|
| 查看次数: |
362 次 |
| 最近记录: |