如果数字在数据帧的行中,则更改数组的值



我有一个这样的数据帧:

'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)])

最新更新