2017-07-14 69 views
1

我有一個df,我想使用2個列(sample,var),以便來自var列的唯一值成爲索引和來自樣本的唯一值其他列成爲新的列名稱。然後我想用'真'來填充表格,無論哪裏有一行,原始df中給定的樣本和變量共同出現,並且na與樣本和變量不同時出現的na一起填充。在pandas中使用列值和標題和自動填充表

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-標頭中返回一個表,樣品仍是這樣的:

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: [] 

我也試過這樣:

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

這返回了正確的信息,但樣品仍在列中,而不是我預期的列名。

目標是最終制作一個熱圖,所以如果有更好的解決方案來實現這一點,那也沒關係。我認爲答案很簡單,我錯過了,但我嘗試過搜索並找不到它。我可能可以使用迭代來解決這個問題,但我真的在尋找一種矢量/熊貓類型的方法。非常感謝。

回答

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

可以使用assignTrue列,然後通過set_indexunstack重塑:

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 - 爲值創建TrueSeries具有相同lenght爲df

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

這是一個非常有用的,很好的解釋答案,但相比其他2級的解決方案是相當複雜的。儘管刪除重複是一個很大的額外想法。非常感謝 – user3062260

3

我會建議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

感謝您的支持,它具有額外的功能,可以替換表格中的自定義字符串。我會把這作爲接受的答案,但克里斯的答案是我最初的代碼最接近的解決方案。 – user3062260

+0

@ user3062260很高興​​幫助,我回復我的答案不是爲了聲望〜祝你有美好的一天 – Wen