我必须从具有两列的源pandas数据帧创建结果pandas数据帧。结果数据框应该包含两种类型的标头,一种类型应该来自源数据框,该数据框是从附加列标题的列值之一派生的值。如果存在重复项,则从源数据帧中获取具有唯一值的另一个标头。结果数据帧单元格值应为1,具体取决于列值是否存在相应的派生标题,如果没有,则为0 数据框如下
dfm = pd.DataFrame({'v' : [44,39,39,8,40,8,15,15],'x':[1,1,1,1,2,2,2,2]})
dfm
v x
44 1
39 1
39 1
8 1
40 2
8 2
15 2
15 2
result
x v_8 v_15 v_39 v_40 v_44
1 1 0 1 0 1
2 1 1 0 1 0
答案 0 :(得分:2)
你能用这样的东西吗?我不确定它是最好的解决方案,所以我有兴趣看看别人发布的内容...
import pandas as pd
dfm = pd.DataFrame({'v' : [44,39,39,8,40,8,15,15],'x':[1,1,1,1,2,2,2,2]}).sort(columns="v")
col_heads = ["v_{}".format(x) for x in dfm.v.unique()]
row_index = dfm.x.unique()
nf = pd.DataFrame(index=row_index, columns=col_heads).fillna(0)
nf.index.name = 'x'
a = dfm.groupby("v")
for i,name in a:
for val in name.x:
nf.ix[val, "v_{}".format(i)] = 1
print nf
这输出以下内容:
v_8 v_15 v_39 v_40 v_44
x
1 1 0 1 0 1
2 1 1 0 1 0
答案 1 :(得分:2)
您可以使用功能crosstab
,然后查找高于1
的值,并按astype
将其转换为1
和0
:
dfm = pd.DataFrame({'v' : [44,39,39,8,40,8,15,15],'x':[1,1,1,1,2,2,2,2]})
print dfm
v x
0 44 1
1 39 1
2 39 1
3 8 1
4 40 2
5 8 2
6 15 2
7 15 2
df = pd.crosstab(dfm.x, dfm.v)
#rename columns
df.rename(columns=lambda x: 'v_' + str(x), inplace=True)
#reset column name v to ''
df.columns.name = ''
print df
v_8 v_15 v_39 v_40 v_44
x
1 1 0 2 0 1
2 1 2 0 1 0
print (df > 0)
v_8 v_15 v_39 v_40 v_44
x
1 True False True False True
2 True True False True False
print (df > 0).astype(int)
v_8 v_15 v_39 v_40 v_44
x
1 1 0 1 0 1
2 1 1 0 1 0