我有一张桌子:
| 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
答案 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:索引包含重复的条目,无法重塑
这意味着Name
和TagID
中有重复项,因此有必要汇总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