【发布时间】:2019-10-13 00:20:48
【问题描述】:
虽然我的数据框有超过 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
我该怎么做?
【问题讨论】:
标签: python pandas dataframe matrix sparse-matrix