2017-06-06 6 views
1

私は単純なピボットテーブルだと思うが、重大な問題を抱えていると思っている。私ができない2つのことがあります:パンダ:True/Falseにピボット、ドロップカラム

  1. 最後に「パートナー」列を取り除きます。
  2. 各企業にそのパートナーがある場合は、値をTrueまたはFalseに設定します。

セットアップ:私は始め

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

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

所望の出力私が近づく

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

が、私は、TRとき私はそれを参照することはできませんし、それは "インデックス"ではありません。第二の問題については

、私が使用することができます。

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

が、それは信じられないほどハックようです。どんな助けもありがとう。

+1

あなたは 'df.assign(ヴァル=真).pivot_table(値= 'valの'、インデックス=」したいですかcompany '、columns =' partner '、fill_value = False) '? – lukeA

+0

@lukeA - はい、まさに私が欲しいものです。ありがとうございました! – pshep123

答えて

3

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


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

が列に名前を取り除くオプションは、オブジェクト

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 

オプション2

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 

オプション3

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 

タイミング
小さなデータ

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

%%timeit 
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)) 

1000 loops, best of 3: 1.67 ms per loop 
100 loops, best of 3: 5.97 ms per loop 
1000 loops, best of 3: 301 µs per loop 
+0

これは非常に役立ちますが、どうすれば "パートナー"のビットを完全に取り除き、希望の出力まで上に上げていくことができますか? – pshep123

+0

あなたはいつものように感謝しています。そして、好奇心から、オプション1&2のために - 今 "パートナー"の列はインデックスですか?マルチインデックス? – pshep123

+0

@ pshep123これは列オブジェクトの名前でした – piRSquared

関連する問題