我基本上没有熊猫的经验,我试图强迫自己更多地使用它。
我正试图加入";计数";以创建计数矩阵。我通常用好的旧python词典来做这件事,但如果有一个简单的方法来处理熊猫,我会有兴趣学习的。
我有多个数据帧。它们的大小不相等。GeneID和geneName基本上是一回事。只是识别基因的不同方法。
我的数据帧如下:
数据帧1:
geneID geneName count
0 A123 ABC 202
1 B456 DEF 30
2 C789 GHI 265
数据帧2:
geneID geneName count
0 X999 FOO 700
1 B456 DEF 606
2 C789 GHI 777
如果基因名称/基因ID不存在于任何数据帧中;0";在矩阵文件中。
以下是加入计数后的期望结果:
geneID geneName df1 df2 df3 ...
0 A123 ABC 202 0
1 B456 DEF 30 606
2 C789 GHI 265 777
3 X999 FOO 0 700
提前感谢您提供的任何解决方案和熊猫学习技巧!
尝试pd.concat
:
pd.concat([d.set_index(['geneID','geneName']).rename(columns={'count':f'df{i}'})
for i,d in enumerate([df1,df2])], axis=1
).fillna(0)
输出:
df0 df1
geneID geneName
A123 ABC 202.0 0.0
B456 DEF 30.0 606.0
C789 GHI 265.0 777.0
X999 FOO 0.0 700.0
或者concat
然后pivot_table
:
(pd.concat([d.assign(col=f'df{i}') for i,d in enumerate([df1,df2])])
.pivot_table(index=['geneID','geneName'], columns='col',
values='count', fill_value=0)
)
或者concat
:中选项key
的类似方法
(pd.concat([df1,df2], keys=['df1','df2'])
.reset_index(level=1,drop=True)
.set_index(['geneID','geneName'],append=True)
['count']
.unstack(level=0, fill_value=0)
)
这里有一种替代方法:
concatdict = {'df1':df1,'df2':df2}
df3 = pd.concat(concatdict).reset_index(level=1,drop=True).set_index(['geneID','geneName'],append=True)['count'].unstack(level=0).fillna(0).reset_index()
或
d = {'df1':df1,'df2':df2}
pd.concat(d).set_index(['geneID','geneName'],append=True).squeeze().unstack(level=0).fillna(0).droplevel(0).reset_index()
或
c = ['geneID','geneName']
pd.concat([df1.set_index(c).squeeze(),df2.set_index(c).squeeze()],keys = ['df1','df2'],axis=1).fillna(0).reset_index()