使用python重塑为二进制变量
我对Python pandas的pivot_表还是个新手,如果某个值在某个观察值中,我会尝试重新塑造数据,使其具有二进制指示符。我遵循了之前的一些代码,得到了一些令人鼓舞的结果,但是我得到的是一个和,而不是理想的1和0。请参阅下面的小样本数据集使用python重塑为二进制变量,python,pandas,dataframe,pivot-table,Python,Pandas,Dataframe,Pivot Table,我对Python pandas的pivot_表还是个新手,如果某个值在某个观察值中,我会尝试重新塑造数据,使其具有二进制指示符。我遵循了之前的一些代码,得到了一些令人鼓舞的结果,但是我得到的是一个和,而不是理想的1和0。请参阅下面的小样本数据集 ID SKILL NUM 1 A 1 1 A 1 1 B 1 2
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
我的代码得到以下结果:
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)
试着这样做:
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)
以最适合您的为准。您可以使用
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
,但这可能会更昂贵。您可以将与用于指示符列,然后获得每个索引的最大值:
df = pd.get_dummies(df.set_index('ID')['SKILL']).max(level=0)
为获得更好的性能,请通过以下方式删除重复项并重塑形状:
解决方案为,但有必要将NaN
s替换为0
:
df = df.drop_duplicates(['ID','SKILL']).pivot('ID','SKILL','NUM').fillna(0).astype(int)
如果想使用您的解决方案,只需删除重复项,但最好是取消堆栈
,因为数据永远不会聚合,因为使用技能
不会重复对ID
:
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
成功了,tks。R不会翻转我的桌子,因为桌子太大了。打开桌子真的很快。。在这种情况下,我如何保持ID作为变量而不是索引?@Ian_De_Oliveira-Last needdf.删除重复项(['ID','SKILL'])。设置索引(['ID','SKILL'])['NUM']。取消堆栈(fill_value=0)。重置索引()。重命名轴(无,轴=1)
Tks很多次,取消堆栈功能运行得非常好。。我知道我需要学习如何处理大数据,因为我的电脑不喜欢翻转55000列,2500行,但55000 atm只有SAS能做到。@Ian_De_Oliveira-这取决于你电脑中的RAM,但要想最好地处理电脑中的大数据
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