pandas 是否可以创建多个相互依赖的列?

bxfogqkk  于 2022-12-16  发布在  其他
关注(0)|答案(1)|浏览(324)

假设我有这样的DF:

Range = np.arange(0,10,1)

Table = pd.DataFrame({"Row": Range})

现在我想添加两个新的列,这两个列是基于彼此的-
例如-

Table["A"]=np.where(Table["B"].shift(1)>0,1,0)
Table["B"]=np.where(Table["A"]==1,1,0)

例如,在Excel中,一圈无效数据不会产生错误,我想知道在Python中,df是否可能出现这种情况。
谢谢。

bis0qfac

bis0qfac1#

你可以尝试一种迭代方法,将B初始化为某个值(例如,所有项都等于None10,或者其他初始化模式),按照你的问题设置A,然后循环并更新AB,直到每个项都收敛或者达到最大迭代阈值:

import pandas as pd
import numpy as np
Range = np.arange(0,4,1)

Table = pd.DataFrame({"Row": Range})
print(Table)

for pair in [(np.nan, np.nan), (None, None), (0,0),(0,1),(1,0),(1,1)]:
    print(f'\npair is {pair}')
    Table["B"] = np.where(Table["Row"] % 2, pair[0], pair[1])
    Table["A"] = np.where(Table["B"].shift(1) > 0, 1, 0)
    i = 0
    prevA, prevB = None, None
    while prevA is None or not prevB.equals(Table["B"]) or not prevA.equals(Table["A"]):
        if i >= 20:
            print('max iterations exceeded')
            break
        print(f'iteration {i}')
        print(Table)
        i += 1
        prevA, prevB = Table["A"].copy(), Table["B"].copy()
        Table["A"] = np.where(Table["B"].shift(1) > 0, 1, 0)
        Table["B"] = np.where(Table["A"] == 1, 1, 0)

注意,对于OP中的示例逻辑,对于B的一些初始化模式,这似乎确实收敛(至少使用长度为4的较短输入数组时确实收敛)。
样本输出:

pair is (nan, nan)
iteration 0
   Row   B  A
0    0 NaN  0
1    1 NaN  0
2    2 NaN  0
3    3 NaN  0
iteration 1
   Row  B  A
0    0  0  0
1    1  0  0
2    2  0  0
3    3  0  0

pair is (None, None)
iteration 0
   Row     B  A
0    0  None  0
1    1  None  0
2    2  None  0
3    3  None  0
iteration 1
   Row  B  A
0    0  0  0
1    1  0  0
2    2  0  0
3    3  0  0

pair is (0, 0)
iteration 0
   Row  B  A
0    0  0  0
1    1  0  0
2    2  0  0
3    3  0  0

pair is (0, 1)
iteration 0
   Row  B  A
0    0  1  0
1    1  0  1
2    2  1  0
3    3  0  1
iteration 1
   Row  B  A
0    0  0  0
1    1  1  1
2    2  0  0
3    3  1  1
iteration 2
   Row  B  A
0    0  0  0
1    1  0  0
2    2  1  1
3    3  0  0
iteration 3
   Row  B  A
0    0  0  0
1    1  0  0
2    2  0  0
3    3  1  1
iteration 4
   Row  B  A
0    0  0  0
1    1  0  0
2    2  0  0
3    3  0  0

pair is (1, 0)
iteration 0
   Row  B  A
0    0  0  0
1    1  1  0
2    2  0  1
3    3  1  0
iteration 1
   Row  B  A
0    0  0  0
1    1  0  0
2    2  1  1
3    3  0  0
iteration 2
   Row  B  A
0    0  0  0
1    1  0  0
2    2  0  0
3    3  1  1
iteration 3
   Row  B  A
0    0  0  0
1    1  0  0
2    2  0  0
3    3  0  0

pair is (1, 1)
iteration 0
   Row  B  A
0    0  1  0
1    1  1  1
2    2  1  1
3    3  1  1
iteration 1
   Row  B  A
0    0  0  0
1    1  1  1
2    2  1  1
3    3  1  1
iteration 2
   Row  B  A
0    0  0  0
1    1  0  0
2    2  1  1
3    3  1  1
iteration 3
   Row  B  A
0    0  0  0
1    1  0  0
2    2  0  0
3    3  1  1
iteration 4
   Row  B  A
0    0  0  0
1    1  0  0
2    2  0  0
3    3  0  0

相关问题