如何根据另一列中的值在数据框中设置零和一

时间:2019-09-08 08:50:16

标签: python python-3.x pandas dataframe

我想根据数据帧中的另一列将列值设置为零和一个。

我尝试了多种方法(使用null值和get_dummies.etc进行数据透视),但是似乎无法覆盖所需的结果。

有人可以帮忙吗?

df

item_code       sale_val    Trans_id
11              10.00       1111
11              10.00       2222
12              2.00        1111
13              1.05        2222
13              1.05        1111
14              3.00        1111
12              2.00        3333
14              3.00        3333
14              3.00        4444

df1- 按id分组显示以下格式

item_code       sale_val    Trans_id
11              10.0        111
13              10.0        222
12              2.0         111
12              2.0         333
13              1.05        111
11              1.05        222
14              3.0         111
14              3.0         333

pd.get_dummies针对df1运行,并在给定的trans_id中将第一个项目ID设置为值“ 1”。 例如:Trans_id 111,商品代码11设置为1,而12到14的商品代码设置为0,或者在设置其他trans_id的值时可能被覆盖。

Trans_id/index  11  12  13  14 
111             1   0   0   0   
222             1   0   0   0   
333             1   0   0   0
#exclude transid count < 1 
df1=(df.groupby("Trans_id").filter(lambda x:len(x)>1)
#generate ones & zeros
df2=pd.get_dummies(df1,columns=['item_code'])

预期格式

Trans_id/index  11  12  13  14 
111             1   1   1   1   
222             1   0   1   0   
333             0   1   0   1           

2 个答案:

答案 0 :(得分:0)

通过DataFrame.set_index创建索引,然后在第一级获取max

#faster solution in large df
df1 = df[df["Trans_id"].duplicated(keep=False)]

df2 = pd.get_dummies(df1.set_index('Trans_id')['item_code']).max(level=0)
print (df2)
          11  12  13  14
Trans_id                
1111       1   1   1   1
2222       1   0   1   0
3333       0   1   0   1

答案 1 :(得分:0)

在一行代码中:

pd.DataFrame(df.pivot(columns='item_code',index='Trans_id').fillna(0)>0).astype(int)

          sale_val         
item_code       11 12 13 14
Trans_id                   
111              1  1  1  1
222              1  0  1  0
333              0  1  0  1