使用loc,iloc和检查条件访问熊猫中的单元格值

时间:2020-03-13 21:04:23

标签: python pandas

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

2 个答案:

答案 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()

获得正确的输出: enter image description here

答案 1 :(得分:0)

# try dummy variables for each column of votes
v1 = pd.get_dummies(cvotes['v1'])
v1.head()

输出: enter image description here