Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python重塑为二进制变量_Python_Pandas_Dataframe_Pivot Table - Fatal编程技术网

使用python重塑为二进制变量

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

我对Python pandas的pivot_表还是个新手,如果某个值在某个观察值中,我会尝试重新塑造数据,使其具有二进制指示符。我遵循了之前的一些代码,得到了一些令人鼓舞的结果,但是我得到的是一个和,而不是理想的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
我的代码得到以下结果:

    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 need
df.删除重复项(['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