我对Python pandas的ivot_table还是陌生的,如果某个值在特定观察范围内,我会尝试重塑数据以具有二进制指示符。我遵循以前的一些代码并获得了一些令人鼓舞的结果,但是我得到的总和不是1和0。请在下面查看小样本数据集
ID SKILL NUM
1 A 1
1 A 1
1 B 1
2 C 1
3 C 1
3 C 1
3 E 1
我想要的结果是:
ID A B C E
1 1 1 0 0
2 0 0 1 0
3 0 0 0 1
我的代码atm得到以下结果:
ID A B C E
1 2 1 0 0
2 0 0 2 0
3 0 0 0 1
我应该先删除重复项吗?
我正在使用atm的代码如下;
df_pivot = df2.pivot_table(index='Job_posting_ID', columns='SKILL', aggfunc=len, fill_value=0)
答案 0 :(得分:1)
尝试这样:
df.pivot_table(index='ID', columns='SKILL', values='NUM', aggfunc=lambda x: len(x.unique()), fill_value=0)
或者这个:
df.pivot_table(index='ID', columns='SKILL',aggfunc=lambda x: int(x.any()), fill_value=0)
最适合您的人。
答案 1 :(得分:1)
您可以使用aggfunc='any'
并将其转换为int
作为单独的步骤。这样可以避免使用lambda
/自定义函数,并且效率更高。
df_pivot = df.pivot_table(index='ID', columns='SKILL',
aggfunc='any', fill_value=0).astype(int)
print(df_pivot)
NUM
SKILL A B C E
ID
1 1 1 0 0
2 0 0 1 0
3 0 0 1 1
对于aggfunc=len
+转换为int
来说,同样的方法也可以,但是这可能会更昂贵。
答案 2 :(得分:1)
您可以将get_dummies
与set_index
一起用于指标列,然后获得每个索引的max
值:
df = pd.get_dummies(df.set_index('ID')['SKILL']).max(level=0)
为了获得更好的性能,请用drop_duplicates
删除重复项,并用set_index
用unstack
重塑形状:
df = df.drop_duplicates(['ID','SKILL']).set_index(['ID','SKILL'])['NUM'].unstack(fill_value=0)
使用pivot
解决方案,但有必要将NaN
s替换为0
:
df = df.drop_duplicates(['ID','SKILL']).pivot('ID','SKILL','NUM').fillna(0).astype(int)
如果要使用您的解决方案,只需删除重复项即可,但最好使用unstack
,因为永远不会汇总数据,因为不会将ID
与SKILL
重复成对:
df2 = df.drop_duplicates(['ID','SKILL'])
df_pivot = (df2.pivot_table(index='ID',
columns='SKILL',
values='NUM',
aggfunc=len,
fill_value=0))
print (df_pivot)
SKILL A B C E
ID
1 1 1 0 0
2 0 0 1 0
3 0 0 1 1