为 pandas DataFrame 中的特定单元格赋值

Assign value to particular cells in pandas DataFrame

虽然我有超过 1000 万行和 40 列,但我有一个结构类似于此的数据框

df = pd.DataFrame([['a1', 'b1','c1','d1'],
                   ['a2', 'b2','c2','d2'],
                   ['a3', 'b3','c3','d3'],
                   ['a4', 'b4','c4','d4'],
                   ['a5', 'b5','c5','d5'],
                   ['a6', 'b6','c6','d6'],
                   ['a7', 'b7','c7','d7']], columns=['pid','tid','aid','cid'])

我想根据条件创建一个包含 0 和 1 的矩阵,如果列名等于特定行中的值,则值为 1,否则为 0。

我按如下方式操作数据框:

colnames = df['aid'].append(df['cid'])

df2 = pd.concat([df,pd.DataFrame(columns=colnames)])
df2 = df2.set_index('pid')
df2 = df2.fillna(0)

cols = df2.columns.tolist()
cols = cols[-1:] + cols[:-1]
df2= df2[cols]

这给了我:

    tid aid  c1  c2  c3  c4  c5  c6  c7 cid  d1  d2  d3  d4  d5  d6  d7
pid                                                                    
a1   b1  c1   0   0   0   0   0   0   0  d1   0   0   0   0   0   0   0
a2   b2  c2   0   0   0   0   0   0   0  d2   0   0   0   0   0   0   0
a3   b3  c3   0   0   0   0   0   0   0  d3   0   0   0   0   0   0   0
a4   b4  c4   0   0   0   0   0   0   0  d4   0   0   0   0   0   0   0
a5   b5  c5   0   0   0   0   0   0   0  d5   0   0   0   0   0   0   0
a6   b6  c6   0   0   0   0   0   0   0  d6   0   0   0   0   0   0   0
a7   b7  c7   0   0   0   0   0   0   0  d7   0   0   0   0   0   0   0

现在,如果 'aid' 或 'cid' 中的值等于列名

,我想将值从 0 更改为 1

我已经尝试了很多类似下面的方法,但没有任何效果:

df2.loc['aid' == colnames] = 1
df2.loc['cid' == colnames] = 1

我想要的输出是:

    tid aid  c1  c2  c3  c4  c5  c6  c7 cid  d1  d2  d3  d4  d5  d6  d7
pid                                                                    
a1   b1  c1   1   0   0   0   0   0   0  d1   1   0   0   0   0   0   0
a2   b2  c2   0   1   0   0   0   0   0  d2   0   1   0   0   0   0   0
a3   b3  c3   0   0   1   0   0   0   0  d3   0   0   1   0   0   0   0
a4   b4  c4   0   0   0   1   0   0   0  d4   0   0   0   1   0   0   0
a5   b5  c5   0   0   0   0   1   0   0  d5   0   0   0   0   1   0   0
a6   b6  c6   0   0   0   0   0   1   0  d6   0   0   0   0   0   1   0
a7   b7  c7   0   0   0   0   0   0   1  d7   0   0   0   0   0   0   1

我该怎么做?

在您的情况下,您可以使用 get_dummies

df=pd.get_dummies(df,columns=['pid','aid'],prefix_sep='',prefix='')
df
  tid cid  a1  a2  a3  a4  a5  a6  a7  c1  c2  c3  c4  c5  c6  c7
0  b1  d1   1   0   0   0   0   0   0   1   0   0   0   0   0   0
1  b2  d2   0   1   0   0   0   0   0   0   1   0   0   0   0   0
2  b3  d3   0   0   1   0   0   0   0   0   0   1   0   0   0   0
3  b4  d4   0   0   0   1   0   0   0   0   0   0   1   0   0   0
4  b5  d5   0   0   0   0   1   0   0   0   0   0   0   1   0   0
5  b6  d6   0   0   0   0   0   1   0   0   0   0   0   0   1   0
6  b7  d7   0   0   0   0   0   0   1   0   0   0   0   0   0   1