为 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
虽然我有超过 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