从多个pandas数据框创建矩阵

jgovgodb  于 2023-06-04  发布在  其他
关注(0)|答案(2)|浏览(125)

我基本上没有Pandas的经验,我试图强迫自己更多地使用它。
我尝试基于特定列连接多个 Dataframe 的“计数”以创建计数矩阵。我通常使用很好的旧python字典来做这件事,但是如果有一种简单的方法可以用pandas来做这件事,我会有兴趣学习。
我有多个 Dataframe 。它们的大小不一样。GeneID和geneName基本上是一样的。只是识别基因的方法不同。
我的 Dataframe 看起来像这样:
Dataframe 1:

geneID  geneName  count
0    A123    ABC       202
1    B456    DEF       30
2    C789    GHI       265

Dataframe 2:

geneID  geneName  count
0    X999    FOO       700
1    B456    DEF       606
2    C789    GHI       777

如果基因名称/基因ID不存在于任何 Dataframe 中,则其在矩阵文件中应具有计数值“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

提前感谢任何解决方案,以及任何Pandas学习技巧!

quhf5bfb

quhf5bfb1#

尝试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)
)
3wabscal

3wabscal2#

这里有一个替代方法:

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

相关问题