选择从条件到另一个条件的数据帧行

发布于 2025-02-05 06:23:38 字数 1244 浏览 2 评论 0原文

我有一个带有两个列的数据框:

        A      B
0   False  False
1   False  False
2   False  False
3    True  False
4   False  False
5   False  False
6   False   True
7   False  False
8   False  False
9   False  False
10   True  False
11  False  False
12  False  False

我想创建一个带有布尔值的新列“ c”,每次b打开和每次打开时,它都会打开(= true)索引10)

ex:对于此DF,输出将是:

    A      B      C
0   False  False  False
1   False  False  False
2   False  False  False
3    True  False  False
4   False  False  False
5   False  False  False
6   False   True   True
7   False  False   True
8   False  False   True
9   False  False   True
10   True  False   True
11  False  False  False
12  False  False  False

我用for loop和“开关”编写了此代码,但是我敢肯定,对于大型数据框架,可以更快,更容易地解决相同的操作。感谢您的帮助。

import pandas as pd
import numpy as np

df = pd.DataFrame({
  'A': [False,False,False,True,False,False,False,False,False,False,True,False,False],
  'B': [False,False,False,False,False,False,True,False,False,False,False,False,False]
})


df["C"]=0
switch=False
for i in df.index :
  if df.B.iloc[i]:
    switch=True
  if switch:
    df.C.iloc[i]=True
  else:
    df.C.iloc[i]=False
  if df.A.iloc[i]:
    switch=False

print(df)

I have a dataframe with two columns:

        A      B
0   False  False
1   False  False
2   False  False
3    True  False
4   False  False
5   False  False
6   False   True
7   False  False
8   False  False
9   False  False
10   True  False
11  False  False
12  False  False

I would like to create a new column "C" with Boolean values, that turns on (=True) each time B turns on and turns of each time A turns on (ex: here between index 6 to index 10)

Ex: for this df, the output will be:

    A      B      C
0   False  False  False
1   False  False  False
2   False  False  False
3    True  False  False
4   False  False  False
5   False  False  False
6   False   True   True
7   False  False   True
8   False  False   True
9   False  False   True
10   True  False   True
11  False  False  False
12  False  False  False

I wrote this code with a for loop and a "switch", but I'm pretty sure there will be faster and easier solution to do the same thing for large dataframes. I appreciate your help.

import pandas as pd
import numpy as np

df = pd.DataFrame({
  'A': [False,False,False,True,False,False,False,False,False,False,True,False,False],
  'B': [False,False,False,False,False,False,True,False,False,False,False,False,False]
})


df["C"]=0
switch=False
for i in df.index :
  if df.B.iloc[i]:
    switch=True
  if switch:
    df.C.iloc[i]=True
  else:
    df.C.iloc[i]=False
  if df.A.iloc[i]:
    switch=False

print(df)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

软甜啾 2025-02-12 06:23:38

使用FFILL的替代方法

df.loc[df['A'],'C'] = False
df.loc[df['B'],'C'] = True

df['C'] = df['C'].ffill().fillna(False) #start "off"

Alternative approach using ffill

df.loc[df['A'],'C'] = False
df.loc[df['B'],'C'] = True

df['C'] = df['C'].ffill().fillna(False) #start "off"
灵芸 2025-02-12 06:23:38

组合两列,减去1,过滤掉负数,偶数:

x = (df['A'] | df['B']).cumsum().sub(1)
df['C'] = (x >= 0) & (x % 2 == 1)

输出:

>>> df
        A      B      C
0   False  False  False
1   False  False  False
2   False  False  False
3    True  False  False
4   False  False  False
5   False  False  False
6   False   True   True  <
7   False  False   True  <
8   False  False   True  <
9   False  False   True  <
10   True  False  False
11  False  False  False
12  False  False  False

Combine the two columns, subtract 1, filter out negative and even numbers:

x = (df['A'] | df['B']).cumsum().sub(1)
df['C'] = (x >= 0) & (x % 2 == 1)

Output:

>>> df
        A      B      C
0   False  False  False
1   False  False  False
2   False  False  False
3    True  False  False
4   False  False  False
5   False  False  False
6   False   True   True  <
7   False  False   True  <
8   False  False   True  <
9   False  False   True  <
10   True  False  False
11  False  False  False
12  False  False  False
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文