我想根据数据帧中的另一列将列值设置为零和一个。
我尝试了多种方法(使用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
答案 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