在pandas中使用列值和标题以及自动填充表

时间:2017-07-14 15:54:07

标签: python pandas dataframe pivot

我有一个df,我想使用2个列(sample,var),以便var列中的唯一值成为索引,而其他col的样本中的唯一值将成为新的列名。然后,我想用“True”填充表格,其中有一行,其中给定的样本和var在原始df中共同出现并填充na,其中样本和var不同时发生。

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-header:

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

这返回了正确的信息,但样本仍在列中,而不是我所期望的列名。

目标是最终制作热图,如果有更好的解决方案来实现这一目标,那么这也很好。我认为答案是简单的,我错过了,但我已经尝试搜索,找不到它。我可以使用迭代解决这个问题,但我真的在寻找一种矢量/ pandas类型的方法。非常感谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您可以将assign用于新的True列,然后使用set_index重新整理unstack

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的解决方案 - 对于值True Series创建的值与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

答案 2 :(得分: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