如何在条件下获取虚拟人

2024-09-25 12:29:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下一张桌子:

| 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 |

我想得到一个形状为(uniqueNames的表× 唯一的TagID),如果TagID具有Key=1,则带1

问题:如何以最有效的方式进行此操作? 只是,我有大约1百万行和3千个唯一的TagID

例如:

|   | 101 | 132 | 160 | 165 | 200 | 285 | 334 | 1123 | 1601 | 1617 | 1991 | 7075 |
|---|-----|-----|-----|-----|-----|-----|-----|------|------|------|------|------|
| 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 |

Tags: keyname方式形状桌子tagiduniquenames
1条回答
网友
1楼 · 发布于 2024-09-25 12:29:46

使用^{},替换缺少的值并转换为整数或使用^{}转换^{}

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: Index contains duplicate entries, cannot reshape

它意味着在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

相关问题 更多 >