Python panda的基于条件下一列的 Dataframe boolean Series/Column

92dk7w1h  于 2023-01-29  发布在  Python
关注(0)|答案(1)|浏览(98)

我很难准确地描述我想要实现的目标。我试着在堆栈上查找其他有相同问题的程序,但是没有找到。所以我将尝试准确地描述我想要实现的目标,并给予你一个示例设置代码。
我希望有一个函数可以给我一个新的列/pd. Series。这个新列包含基于特定条件的布尔TRUE值(或int值)。
条件如下。有N个列(例如8),每个具有相同的名称,但以一个新的数字结束。IE,column_1,column_2等。我需要的功能是双重的:
1.如果给定N,则查找/通过每个列行,并查看它和下一个N列行是否也为TRUE/1。
1.如果未给出N,则查找每个列的行,如果所有下一列的行也为TRUE/1,则以数字作为ID来查找该列。

def get_df_series(df: pd.DataFrame, columns_ids: list, n: int=8) -> pd.Dataframe:

    for i in columns_ids:
        # missing code here .. i dont know if this would be the way to go
        pass

    return df

def create_dataframe(numbers: list) -> pd.DataFrame:
    df = pd.DataFrame()  # empty df

    # create a column for each number with the number as ID and with random boolean values as int's
    for i in numbers:
        df[f'column_{i}'] = np.random.randint(2, size=20)

    return df

if __name__=="__main__":

    numbers = [1, 2, 3, 4, 5, 6, 7, 8]

    df = create_dataframe(numbers=numbers)

    df = get_df_series(df=df, numbers=numbers, n=3)

我有一些Pandas Dataframe 的经验,知道如何创建IF/ELSE的东西与np.select为例。

(function) select(condlist: Sequence[ArrayLike], choicelist: Sequence[ArrayLike], default: ArrayLike = ...) -> NDArray

我遇到的问题是,如果我不知道前面有多少列,我不知道如何创建条件语句,例如,如果我想知道column_5后面的3列是否也为真,我可以硬编码。但我有ID最大为20的列,我希望不必对column_1到column_的所有内容进行硬编码如果我想知道那些列中的所有条件是否都为真。
现在的问题是,我不知道这是否可能,所以任何反馈都会被接受,甚至只是给我一个提示,告诉我去哪里寻找一种方法来做到这一点。

EDIT:我忘了提到的是,中间会有一些随机的列,这些列显然不能被纳入等式。例如,会有main_column_1、main_column_2、main_column_3、side_column_1、side_column_2、right_column_1、main_column_3、main_column_4等......

Corralian给出的答案是正确的,但我应该把我的问题说得更清楚一些。
我需要能够,比如说,查看main_column,并为此查看N个相同类型的列:主列。

2mbi3lxu

2mbi3lxu1#

试试看:

n = 3
out = (df.rolling(n, min_periods=1, axis=1).sum()
         .shift(-n+1, fill_value=0, axis=1).eq(n).astype(int)
         .rename(columns=lambda x: 'result_' + x.split('_')[1]))

输出:

>>> out
    result_1  result_2  result_3  result_4  result_5  result_6  result_7  result_8
0          1         1         1         1         1         1         0         0
1          0         0         0         0         0         0         0         0
2          0         0         0         0         0         0         0         0
3          0         0         0         0         0         0         0         0
4          0         0         0         1         0         0         0         0
5          0         0         0         0         0         0         0         0
6          0         0         0         0         0         0         0         0
7          0         0         0         0         0         0         0         0
8          0         1         1         1         0         0         0         0
9          0         0         0         0         0         1         0         0
10         0         0         0         0         0         0         0         0
11         0         0         0         0         1         0         0         0
12         0         0         0         0         0         0         0         0
13         0         0         0         1         1         0         0         0
14         0         0         0         0         0         1         0         0
15         0         0         0         0         0         0         0         0
16         0         0         0         0         0         0         0         0
17         0         0         1         0         0         0         0         0
18         0         0         1         0         0         0         0         0
19         0         0         0         0         0         0         0         0

输入:

>>> df
    column_1  column_2  column_3  column_4  column_5  column_6  column_7  column_8
0          1         1         1         1         1         1         1         1
1          0         1         0         0         0         1         1         0
2          1         1         0         1         0         1         1         0
3          1         0         1         0         0         0         0         0
4          1         0         0         1         1         1         0         1
5          1         1         0         1         0         1         1         0
6          1         0         1         0         0         0         0         1
7          0         0         1         0         0         0         0         0
8          0         1         1         1         1         1         0         0
9          1         0         1         1         0         1         1         1
10         0         0         1         1         0         0         1         1
11         1         0         1         0         1         1         1         0
12         0         1         1         0         1         0         1         0
13         0         0         0         1         1         1         1         0
14         0         0         1         1         0         1         1         1
15         1         0         0         1         0         1         0         0
16         1         0         0         0         0         0         0         1
17         0         0         1         1         1         0         0         1
18         0         0         1         1         1         0         0         1
19         0         0         1         0         0         0         1         0

相关问题