我有一个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类型的方法。非常感谢。
答案 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