数据框,列名由列值和单元格值按条件派生而来

时间:2015-12-22 19:01:19

标签: python pandas dataframe

我必须从具有两列的源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 

2 个答案:

答案 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将其转换为10

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