UCI国会投票数据集,其中1.0是,0.0是否,NaN是弃权。第二组列是我要添加到数据框中的内容,但这些值不正确。 我正在尝试对该数据框进行二值化,因此具有类似以下内容:
100 for yay
010 for nay
001 for abstain
所以我可以运行关联规则。
我能够创建16个多余的列(因为从v1到v16有16票)。
但是,当我尝试通过检查上面显示的原始表决列中的值来创建16个nay列时,该列不起作用,因为如上所见,nay_v1
应该是1,1,0,1,0
,但是1,1,1,1,1
。
弃权栏是使用isna()
创建的,但是要否,我想检查投票栏的值是否为0.0,如果是,则为该投票的否栏输入1.0。
我根据此站点上的答案尝试了使用loc和iloc的两种方法,但均无济于事,我认为输出都是我上面发布的内容。
第一种方法:
for (idx, row) in cvotes.iterrows():
for c in cols:
if row.loc[c]==0.0:
cvotes[f'nay_{c}'] = 1.0
elif row.loc[c] == 1.0:
cvotes[f'nay_{c}'] = 0.0
elif row.loc[c] == np.nan:
cvotes[f'nay_{c}'] = 0.0
第二种方法:
for c in cols:
for i in range(len(cvotes.iloc[:][c])):
val = cvotes.iloc[i][c]
if val == 0.0:
cvotes[f'nay_{c}'] = 1.0
else:
cvotes[f'nay_{c}'] = 0.0
我在这里做错了什么?这相当令人沮丧,因为我认为我可以使用numpy数组索引甚至Python列表索引。
编辑:
示例数据框:
cvotes = pd.read_csv('house-votes-84.data', sep=',', header=None)
cvotes.head()
cvotes.columns = ['party', 'v1','v2','v3', 'v4','v5','v6','v7',
'v8', 'v9', 'v10', 'v11', 'v12', 'v13','v14','v15',
'v16']
cvotes.head()
从http://archive.ics.uci.edu/ml/datasets/Congressional+Voting+Records
下载csv这是我想要的结果:
v1 nay_v1
0.0 1.0
0.0 1.0
NaN 0.0
0.0 1.0
1.0 0.0
更新了我的代码,但是现在我得到的是0
# make cols for is nay
for c in cols:
#make column preset to val
cvotes[f'nay_{c}']= 0.0
#iterate and change vals on vote col condition
for i in range(len(cvotes.iloc[:][c])):
val = cvotes.iloc[i][c]
#print(val)
if val == 0.0:
cvotes.iloc[i][f'nay_{c}'] = 1.0
else:
cvotes.iloc[i][f'nay_{c}'] = 0.0
答案 0 :(得分:0)
我看到了这个:Pandas/Python: Set value of one column based on value in another column
做了:
for c in cols:
cvotes[f'nay_{c}'] = cvotes[c]
cvotes.loc[cvotes[c] == 0.0, f'nay_{c}']=1.0
cvotes.loc[cvotes[c] == 1.0, f'nay_{c}']=0.0
cvotes.loc[cvotes[c].isna(), f'nay_{c}']=0.0
pd.set_option('display.max_columns', None)
cvotes.head()
答案 1 :(得分:0)