如何获得条件假人

时间:2018-10-09 11:17:15

标签: python pandas

我有一张桌子:

| Name | TagID |  Key  |
|------|-------|-------|
| a    |   285 |     1 |
| a    |   101 |     0 |
| a    |   200 |     1 |
| a    |  1601 |     0 |
| a    |  1991 |     0 |
| a    |  7075 |     0 |
| b    |   285 |     1 |
| b    |   132 |     0 |
| b    |   101 |     0 |
| b    |   200 |     1 |
| b    |   165 |     0 |
| b    |  1617 |     0 |
| b    |   160 |     0 |
| b    |   334 |     1 |
| c    |   285 |     1 |
| c    |  1123 |     1 |
| c    |   200 |     0 |

我想得到一个形状为(唯一Names×唯一TagID)的表,如果TagID的{​​{1}} = 1,则为1。

问题:如何以最有效的方式做到这一点? 只是,我大约有100万行和3k个唯一的Key

例如:

TagID

1 个答案:

答案 0 :(得分:1)

使用pivot,替换缺失值,并用set_index转换为整数或unstack

df1 = df.pivot('Name','TagID','Key').fillna(0).astype(int)
#alternative
#df1 = df.set_index(['Name','TagID'])['Key'].unstack(fill_value=0)
print (df1)
TagID  101   132   160   165   200   285   334   1123  1601  1617  1991  7075
Name                                                                         
a         0     0     0     0     1     1     0     0     0     0     0     0
b         0     0     0     0     1     1     1     0     0     0     0     0
c         0     0     0     0     0     1     0     1     0     0     0     0

编辑:如果得到:

  

ValueError:索引包含重复的条目,无法重塑

这意味着NameTagID中有重复项,因此有必要汇总max

df2 = df.groupby(['Name','TagID'])['Key'].max().unstack(fill_value=0)
#alternative
df2 = df.pivot_table(index='Name',
                     columns='TagID',
                     values='Key',
                     fill_value=0,
                     aggfunc='max')

print (df2)
TagID  101   132   160   165   200   285   334   1123  1601  1617  1991  7075
Name                                                                         
a         0     0     0     0     1     1     0     0     0     0     0     0
b         0     0     0     0     1     1     1     0     0     0     0     0
c         0     0     0     0     0     1     0     1     0     0     0     0