我有一个这样的数据帧:
'id' 'num'
0 54 [2,2,3,1]
1 55 [2,1,2,2,2]
2 58 [1,2,2,2]
3 552 [1,4,3]
和这样的阵列:
0 1 2 3 4
0 0 0 0 0 0
1 0 0 0 0 0
2 0 0 0 0 0
3 0 0 0 0 0
我用创建了数据帧
df = data.groupby('id')['num'].apply(list).reset_index()
和带有的阵列
df_neu = np.full(data[['id', 'num']].nunique(), 0)
我想更改数据帧的值,使其为"1",如果数字"2"在列"num"中,则为列"id"中的"54",否则为"0">
比如:
0 1 2 3
0 1 1 1 0
1 1 1 0 0
2 1 1 0 0
3 1 0 1 1
您可以尝试(类似于我在这里的建议(:
columns = sorted(set().union(*(num for num in df['num'].values)))
df_neu = pd.DataFrame({key: [1 if c in df['num'].loc[i] else 0
for c in columns]
for i, key in zip(df.index, df['id'].values)},
index=columns).T
结果:
1 2 3 4
54 1 1 1 0
55 1 1 0 0
58 1 1 0 0
552 1 0 1 1
我认为首先转换原始DataFramedf
是个好主意(性能方面(:
df['num'] = df['num'].transform(set)
这是一个没有转座的版本,可能更好:
df['num'] = df['num'].transform(set) # Not necessary
columns = sorted(set().union(*(num for num in df['num'].values)))
df_neu = pd.DataFrame([[1 if c in df['num'].loc[i] else 0
for c in columns]
for i, key in zip(df.index, df['id'].values)])