熊猫:转向真/假,掉落专栏

时间:2017-06-06 01:12:53

标签: python pandas pivot

我试图创建我认为简单的数据透视表但我遇到了严重问题。有两件事我无法做到:

  1. 摆脱"伙伴"最后一栏。
  2. 如果每家公司都有该合作伙伴,请将值设置为True或False。
  3. 设定:

    df = pd.DataFrame({'company':['a','b','c','b'], 'partner':['x','x','y','y'], 'str':['just','some','random','words']})
    

    期望输出:

    company     x      y  
    a        True  False
    b        True   True
    c       False   True
    

    我开始时:

    df = df.pivot(values = 'partner', columns = 'partner', index = 'company').reset_index()
    

    让我接近,但当我试图摆脱"伙伴"专栏,我甚至无法引用它,它不是"索引"。

    对于第二个问题,我可以使用:

    df.fillna(False, inplace = True)
    df.loc[~(df['x'] == False), 'x'] = True
    df.loc[~(df['y'] == False), 'y'] = True
    

    但这看起来令人难以置信的hacky。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:5)

选项1

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseCors(
        options => options.WithOrigins("http://example.com").AllowAnyMethod()
    );

    app.UseMvc();
}

删除列对象上的名称

df.groupby(['company', 'partner']).size().unstack(fill_value=0).astype(bool)


partner      x      y
company              
a         True  False
b         True   True
c        False   True

选项2

df.groupby(['company', 'partner']).size().unstack(fill_value=0).astype(bool) \
    .rename_axis(None, 1).reset_index()

  company      x      y
0       a   True  False
1       b   True   True
2       c  False   True

选项3

pd.crosstab(df.company, df.partner).astype(bool)

partner      x      y
company              
a         True  False
b         True   True
c        False   True


pd.crosstab(df.company, df.partner).astype(bool) \
    .rename_axis(None, 1).reset_index()

  company      x      y
0       a   True  False
1       b   True   True
2       c  False   True

<强>时序
小数据

f1, u1 = pd.factorize(df.company.values)
f2, u2 = pd.factorize(df.partner.values)
n, m = u1.size, u2.size

b = np.bincount(f1 * m + f2)
pad = np.zeros(n * m - b.size, dtype=int)
b = np.append(b, pad)
v = b.reshape(n, m).astype(bool)

pd.DataFrame(np.column_stack([u1, v]), columns=np.append('company', u2))

  company      x      y
0       a   True  False
1       b   True   True
2       c  False   True

答案 1 :(得分:0)

另一种选择:

df = df.pivot(values='partner', columns='partner', index='company').reset_index()

df = df.pivot(values='partner', columns='partner', index='company').notna()

不过,我更喜欢 lukeA 在评论中的回答:

df.assign(val=True).pivot_table(values='val', index='company', columns='partner', fill_value=False)

答案 2 :(得分:0)

使用 aggfunc any 对任何非 nan 值返回 true

  df = pd.DataFrame({'company':['a','b','c','b'], 'partner':['x','x','y','y'], 'str':['just','some','random','words']})
  fp=df.pivot_table(index=['company'],columns=['partner'],aggfunc=any).fillna(False)
  print(fp.head())

output

str       
partner      x      y
company              
a         True  False
b         True   True
c        False   True