Pandas Dataframe - 添加其他?
Pandas Dataframe - Adding Else?
我想为我的贝叶斯网络生成测试数据。
这是我当前的代码:
data = np.random.randint(2, size=(5, 6))
columns = ['p_1', 'p_2', 'OP1', 'OP2', 'OP3', 'OP4']
df = pd.DataFrame(data=data, columns=columns)
df.loc[(df['p_1'] == 1) & (df['p_2'] == 1), 'OP1'] = 1
df.loc[(df['p_1'] == 1) & (df['p_2'] == 0), 'OP2'] = 1
df.loc[(df['p_1'] == 0) & (df['p_2'] == 1), 'OP3'] = 1
df.loc[(df['p_1'] == 0) & (df['p_2'] == 0), 'OP4'] = 1
print(df)
所以每次,例如,p_1 有一个 1,p_2 有一个 1,OP1 也应该是 1,所有其他值应该在列中输出 0。
当p_1为1且p_2为0时,OP2应为1,其他均为0,依此类推。
但我当前的输出如下:
p_1
p_2
OP1
OP2
OP3
OP4
0
0
0
0
0
1
1
0
1
1
1
1
0
0
1
1
0
1
0
1
1
1
1
1
1
0
0
1
1
0
有什么办法可以解决吗?我做错了什么?
其他人的问题解答我不是很懂,所以想在这里问一下。
希望有人能帮助我。
您可以为测试定义元组,并通过将掩码值转换为整数来创建新列,用于 True/False
到 1/0
映射:
vals = [(1,1),(1,0),(0,1),(0,0)]
for i, (a, b) in enumerate(vals, 1):
df[f'OP{i}'] = ((df['p_1'] == a) & (df['p_2'] == b)).astype(int)
print(df)
p_1 p_2 OP1 OP2 OP3 OP4
0 0 0 0 0 0 1
1 0 1 0 0 1 0
2 0 1 0 0 1 0
3 0 1 0 0 1 0
4 1 0 0 1 0 0
在您的解决方案中首先设置 0
,因为原始 DataFrame
中已经设置了 1
值:
cols = ['OP1', 'OP2', 'OP3', 'OP4']
df[cols] = 0
问题是当您实例化 df
时,“OP”列已经有一些值:
data = np.random.randint(2, size=(5, 6))
columns = ['p_1', 'p_2', 'OP1', 'OP2', 'OP3', 'OP4']
df = pd.DataFrame(data=data, columns=columns)
df
p_1 p_2 OP1 OP2 OP3 OP4
0 1 1 0 1 0 0
1 0 0 1 1 0 1
2 0 1 1 1 0 0
3 1 1 1 1 0 1
4 0 1 1 0 1 0
用您的代码修复它的一种方法是在之前强制所有“OP”列为 0:
df["OP1"] = df["OP2"] = df["OP3"] df["OP4"] = 0
但是你生成的随机数太多了。我会这样做:
data = np.random.randint(2, size=(5, 2))
columns = ['p_1', 'p_2']
df = pd.DataFrame(data=data, columns=columns)
df["OP1"] = ((df['p_1'] == 0) & (df['p_2'] == 1)).astype(int)
我想为我的贝叶斯网络生成测试数据。 这是我当前的代码:
data = np.random.randint(2, size=(5, 6))
columns = ['p_1', 'p_2', 'OP1', 'OP2', 'OP3', 'OP4']
df = pd.DataFrame(data=data, columns=columns)
df.loc[(df['p_1'] == 1) & (df['p_2'] == 1), 'OP1'] = 1
df.loc[(df['p_1'] == 1) & (df['p_2'] == 0), 'OP2'] = 1
df.loc[(df['p_1'] == 0) & (df['p_2'] == 1), 'OP3'] = 1
df.loc[(df['p_1'] == 0) & (df['p_2'] == 0), 'OP4'] = 1
print(df)
所以每次,例如,p_1 有一个 1,p_2 有一个 1,OP1 也应该是 1,所有其他值应该在列中输出 0。 当p_1为1且p_2为0时,OP2应为1,其他均为0,依此类推。
但我当前的输出如下:
p_1 | p_2 | OP1 | OP2 | OP3 | OP4 | |
---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 1 | |
1 | 0 | 1 | 1 | 1 | 1 | |
0 | 0 | 1 | 1 | 0 | 1 | |
0 | 1 | 1 | 1 | 1 | 1 | |
1 | 0 | 0 | 1 | 1 | 0 |
有什么办法可以解决吗?我做错了什么?
其他人的问题解答我不是很懂,所以想在这里问一下。
希望有人能帮助我。
您可以为测试定义元组,并通过将掩码值转换为整数来创建新列,用于 True/False
到 1/0
映射:
vals = [(1,1),(1,0),(0,1),(0,0)]
for i, (a, b) in enumerate(vals, 1):
df[f'OP{i}'] = ((df['p_1'] == a) & (df['p_2'] == b)).astype(int)
print(df)
p_1 p_2 OP1 OP2 OP3 OP4
0 0 0 0 0 0 1
1 0 1 0 0 1 0
2 0 1 0 0 1 0
3 0 1 0 0 1 0
4 1 0 0 1 0 0
在您的解决方案中首先设置 0
,因为原始 DataFrame
中已经设置了 1
值:
cols = ['OP1', 'OP2', 'OP3', 'OP4']
df[cols] = 0
问题是当您实例化 df
时,“OP”列已经有一些值:
data = np.random.randint(2, size=(5, 6))
columns = ['p_1', 'p_2', 'OP1', 'OP2', 'OP3', 'OP4']
df = pd.DataFrame(data=data, columns=columns)
df
p_1 p_2 OP1 OP2 OP3 OP4
0 1 1 0 1 0 0
1 0 0 1 1 0 1
2 0 1 1 1 0 0
3 1 1 1 1 0 1
4 0 1 1 0 1 0
用您的代码修复它的一种方法是在之前强制所有“OP”列为 0:
df["OP1"] = df["OP2"] = df["OP3"] df["OP4"] = 0
但是你生成的随机数太多了。我会这样做:
data = np.random.randint(2, size=(5, 2))
columns = ['p_1', 'p_2']
df = pd.DataFrame(data=data, columns=columns)
df["OP1"] = ((df['p_1'] == 0) & (df['p_2'] == 1)).astype(int)