Python 从多个数据帧创建矩阵

Python 从多个数据帧创建矩阵,python,pandas,dataframe,join,Python,Pandas,Dataframe,Join,我基本上没有熊猫的经验,我试图强迫自己更多地使用它 我正试图基于一个特定列将多个数据帧的“计数”合并起来,以创建一个计数矩阵。我通常使用好的python旧词典来完成这项工作,但如果有一种简单的方法可以使用pandas来完成这项工作,我会对学习感兴趣 我有多个数据帧。它们的大小不一样。GeneID和geneName基本上是一样的。只是识别基因的不同方法 我的数据帧如下所示: 数据框架1: geneID geneName count 0 A123 ABC 202

我基本上没有熊猫的经验,我试图强迫自己更多地使用它

我正试图基于一个特定列将多个数据帧的“计数”合并起来,以创建一个计数矩阵。我通常使用好的python旧词典来完成这项工作,但如果有一种简单的方法可以使用pandas来完成这项工作,我会对学习感兴趣

我有多个数据帧。它们的大小不一样。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)
(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)
)
输出:

                   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\u表

(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
中使用选项
的类似方法:

pd.concat([d.set_index(['geneID','geneName']).rename(columns={'count':f'df{i}'})
           for i,d in enumerate([df1,df2])], axis=1
         ).fillna(0)
(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()

非常感谢。这正是我需要建立的基础!万分感谢!“康卡特”是我所错过的哈哈。这帮了大忙!