2017-07-14 4 views
1

私はdfを持っていますが、var列からの一意の値がインデックスとサンプルの一意の値になるように2つの列(sample、var)他の列は新しい列名になります。与えられたサンプルとvarがオリジナルのdfで共起していて、サンプルとvarが共起していないnaを持つ行があったところで、テーブルを 'True'に設定したいと思います。パンダの列の値とヘッダーとオートポピュレートテーブルを使用

sample, var 
s1, v1 
s1, v2 
s2, v1 
s2, v3 

はなる:

s1, s2 
v1, T, T 
v2, T, na 
v3, na, T 

すでにこれを答える質問がすでに存在する場合、私はお詫び申し上げます。私はパンダには新しく、検索する技術用語が不明です。私はthis possible anserをしようとしたが、それは私のために動作しませんでしたし、このようCOL-ヘッダ列ではなくて、まだサンプルを使用してテーブルを返しました:

df_all['MUT']=True 
pivot = df_all.pivot(index='VAR', columns='SAMPLE', values='MUT').stack(dropna=False) 
print(pivot.head(20)) 

この:私もこれを試してみました

pivot = df_all.pivot(index='VAR', columns='SAMPLE').stack(dropna=False) 
print(pivot.head(20)) 

var, sample 
v1, s1 
v1, s2 
v2, s1 
v3, s2 
Empty dataframe 
Columns: [] 
Index: [] 

正しい情報が返されましたが、サンプルは、私が期待したように列の名前ではなく、列に残っていました。

目的はヒートマップを最終的に作成することです。これを達成するためのより良い解決策がある場合は、それも問題ありません。答えは私が逃したシンプルなものだと思っていますが、私は検索しようとしましたが見つかりませんでした。私はおそらくこれを繰り返しを使用して解決することができますが、実際にベクトル/パンダ型のアプローチを探しています。どうもありがとう。あなたはその後、unstackset_indexによって再構築、新しいTrue列にassignを使用することができます

答えて

2
df = pd.DataFrame({'sample': ['s1', 's1', 's2', 's2'], 'var': ['v1', 'v2', 'v1', 'v3']}) 
df['MUT'] = True 
df =df.pivot(index='var', columns='sample') 

print(df) 

出力:

  MUT  
sample s1 s2 
var    
v1  True True 
v2  True None 
v3  None True 
2

df1 = df.assign(a=True).set_index(['var', 'sample'])['a'].unstack().replace({None:np.nan}) 
print (df1) 
sample s1 s2 
var    
v1  True True 
v2  True NaN 
v3  NaN True 

ソリューションpivotと - 値のために作成されているのと同じな長さを持つTrueSeriesdfとして:

df1 = pd.pivot(index=df['var'], 
       columns=df['sample'], 
       values=pd.Series([True] * len(df.index))) \ 
     .replace({None:np.nan}) 
print (df1) 
sample s1 s2 
var    
v1  True True 
v2  True NaN 
v3  NaN True 

重複する場合は、解決策は同じですが、最初に追加するだけですdrop_duplicates

print (df) 
    sample var 
0  s1 v1 <-dupe 
1  s1 v1 <-dupe 
2  s1 v2 
3  s2 v1 
4  s2 v3 

df = df.drop_duplicates() 
print (df) 
    sample var 
0  s1 v1 
2  s1 v2 
3  s2 v1 
4  s2 v3 
+0

お勧めします。しかし、重複ドロップは素晴らしい余分な考えです。多くのありがとう – user3062260

3

私はこれは本当に便利な、よく説明の答えですが、他の2つのソリューションに比べて非常に複雑であるpd.crosstab

pd.crosstab(df['var'],df['sample']).replace({1:'T',0:np.nan}) 

sample s1 s2 
var    
v1  T T 
v2  T NaN 
v3  NaN T 
+0

ありがとう、テーブルがカスタム文字列でどのように満たされるかを置き換えることができるという余分な機能を持っているのは本当に便利です。私はこれを受け入れられた答えとして置きますが、Chrisの答えは私の元のコードに最も近い修正です。 – user3062260

+0

@ user3062260喜んで助けてください、私は評判のためではなく、助けを求めるために私の答えを返す〜良い一日を – Wen

関連する問題