根据条件匹配其他列中的行值更新列
update column based on matching row values in other columns with condition
我需要根据它们在其他列中包含的值,将以 _4 结尾的列中的值替换为更新后的值。如果前 3 列包含 1,则第四列应为零。如果前三列包含零,则第四列应为 1。
在我下面的代码中,我想指定这个计数变量与公共列(即 a 或 b)同名 - 然后用这个新计数替换原始数据框中的 x'_4' 列柱子
然而,它也没有正确计数,因为当前 a 和 b 的计数是正确的。欢迎任何意见。谢谢
import pandas as pd
import numpy as np
df = pd.DataFrame({ 'a_1':[1, 0, 0, 0],
'a_2':[0, 0, 0, 1],
'a_3':[0, 0, 0, 0],
'a_4':[1, 0, 1, 1],
'b_1':[0, 0, 0, 1],
'b_2':[0, 0, 0, 1],
'b_3':[1, 1, 0, 0],
'b_4':[0, 1, 0, 1]})
我当前的代码是这样的
out = []
counts = []
col_list = ('a','b')
for col in col_list:
d = df.loc[:,df.columns.str.startswith(col)]
dat = df.loc[:, ~df.columns.str.endswith('4')]
counts = dat[(dat.isin([1]).any(1).astype(int))|(d.isin([1]).all(0).astype(int))]
counts^=1
counts_df = pd.DataFrame(counts)
out.append(counts_df)
原始数据框中被覆盖的列应如下所示
a_4 b_4
0 0 0
1 1 0
2 1 1
3 0 0
尝试通过 filter()
并获取像 '_4'
:
这样的列名
cols=df.filter(like='_4').columns
最后:
df[cols]=(df.filter(regex='_[0-3]')
.rename(columns=lambda x:x.split('_')[0])
.groupby(axis=1,level=0).sum().eq(0).astype(int))
df
的输出:
a_1 a_2 a_3 a_4 b_1 b_2 b_3 b_4
0 1 0 0 0 0 0 1 0
1 0 0 0 1 0 0 1 0
2 0 0 0 1 0 0 0 1
3 0 1 0 0 1 1 0 0
我需要根据它们在其他列中包含的值,将以 _4 结尾的列中的值替换为更新后的值。如果前 3 列包含 1,则第四列应为零。如果前三列包含零,则第四列应为 1。
在我下面的代码中,我想指定这个计数变量与公共列(即 a 或 b)同名 - 然后用这个新计数替换原始数据框中的 x'_4' 列柱子 然而,它也没有正确计数,因为当前 a 和 b 的计数是正确的。欢迎任何意见。谢谢
import pandas as pd
import numpy as np
df = pd.DataFrame({ 'a_1':[1, 0, 0, 0],
'a_2':[0, 0, 0, 1],
'a_3':[0, 0, 0, 0],
'a_4':[1, 0, 1, 1],
'b_1':[0, 0, 0, 1],
'b_2':[0, 0, 0, 1],
'b_3':[1, 1, 0, 0],
'b_4':[0, 1, 0, 1]})
我当前的代码是这样的
out = []
counts = []
col_list = ('a','b')
for col in col_list:
d = df.loc[:,df.columns.str.startswith(col)]
dat = df.loc[:, ~df.columns.str.endswith('4')]
counts = dat[(dat.isin([1]).any(1).astype(int))|(d.isin([1]).all(0).astype(int))]
counts^=1
counts_df = pd.DataFrame(counts)
out.append(counts_df)
原始数据框中被覆盖的列应如下所示
a_4 b_4
0 0 0
1 1 0
2 1 1
3 0 0
尝试通过 filter()
并获取像 '_4'
:
cols=df.filter(like='_4').columns
最后:
df[cols]=(df.filter(regex='_[0-3]')
.rename(columns=lambda x:x.split('_')[0])
.groupby(axis=1,level=0).sum().eq(0).astype(int))
df
的输出:
a_1 a_2 a_3 a_4 b_1 b_2 b_3 b_4
0 1 0 0 0 0 0 1 0
1 0 0 0 1 0 0 1 0
2 0 0 0 1 0 0 0 1
3 0 1 0 0 1 1 0 0