Python 在两个不同长度的数据帧列表上迭代,并将它们作为数据帧连接在一个循环中以执行一个函数
比如,我有两个数据帧列表。数据帧列表的大小为Python 在两个不同长度的数据帧列表上迭代,并将它们作为数据帧连接在一个循环中以执行一个函数,python,pandas,numpy,Python,Pandas,Numpy,比如,我有两个数据帧列表。数据帧列表的大小为 len(list_df1) 20 list_df1 [ Gene_id TCGA-A1-A0SM-01A-11R-A084-07 \ 0 ENSG00000000003_PC 2.609759e+05 1 ENSG00000000005_PC 2.046517e+02 2 ENSG00000000419_P
len(list_df1)
20
list_df1
[ Gene_id TCGA-A1-A0SM-01A-11R-A084-07 \
0 ENSG00000000003_PC 2.609759e+05
1 ENSG00000000005_PC 2.046517e+02
2 ENSG00000000419_PC 6.300425e+05
3 ENSG00000000457_PC 7.922487e+04
4 ENSG00000000460_PC 4.759842e+04
... ... ...
999 ENSG00000067167_PC 1.661041e+06
1000 ENSG00000067177_PC 1.117150e+05
1001 ENSG00000067182_PC 8.435913e+05
1002 ENSG00000067191_PC 1.219213e+05
1003 ENSG00000067208_PC 8.953860e+04
TCGA-A2-A04W-01A-31R-A115-07 TCGA-A2-A04X-01A-21R-A034-07 \
0 3.557029e+05 112350.116669
1 3.668742e+02 678.138127
2 9.395870e+05 980843.179895
3 7.663316e+04 54672.074426
4 3.543807e+04 21895.818992
... ... ...
999 1.306383e+06 652885.437844
1000 1.706889e+05 65106.955798
1001 1.255371e+06 634635.692737
1002 4.121517e+04 35705.970261
1003 7.729493e+04 51846.101598
TCGA-A2-A0D1-01A-11R-A034-07 TCGA-A2-A0EQ-01A-11R-A034-07 \
0 4.379606e+05 2.218208e+05
1 2.502301e+03 1.585833e+03
2 5.090120e+05 6.800754e+05
3 7.601743e+04 6.207091e+04
4 4.759907e+04 4.022122e+04
... ... ...
对于第二个数据帧列表
len(list_df2)
15
list_df2
[ Gene_id TCGA-A1-A0SM-01A-11R-A084-07 \
1580 ENSG00000082929_lncRNAs 283.066402
1598 ENSG00000083622_lncRNAs 0.000000
1995 ENSG00000093100_lncRNAs 761.296884
2127 ENSG00000099869_lncRNAs 4134.407284
2819 ENSG00000103472_lncRNAs 4081.669994
... ... ...
25447 ENSG00000224648_lncRNAs 0.000000
25448 ENSG00000224649_lncRNAs 0.000000
25450 ENSG00000224652_lncRNAs 13698.679519
25452 ENSG00000224655_lncRNAs 454.154778
25455 ENSG00000224658_lncRNAs 0.000000
TCGA-A2-A04W-01A-31R-A115-07 TCGA-A2-A04X-01A-21R-A034-07 \
1580 16745.726795 0.000000
1598 0.000000 0.000000
1995 1091.806755 504.529752
2127 2058.792103 0.000000
2819 4541.654924 12125.955565
... ... ...
25447 0.000000 0.000000
25448 1806.322490 0.000000
25450 20679.823343 8560.813731
25452 0.000000 0.000000
25455 0.000000 0.000000
TCGA-A2-A0D1-01A-11R-A034-07 TCGA-A2-A0EQ-01A-11R-A034-07 \
1580 79172.350419 365.577246
1598 0.000000 0.000000
1995 698.135025 294.962048
2127 1053.164305 0.000000
2819 4517.449536 9633.998928
... ... ...
25447 0.000000 0.000000
25448 0.000000 0.000000
25450 6887.145309 931.142046
25452 347.062760 293.268032
25455 1619.254228 0.000000
TCGA-A2-A0T1-01A-21R-A084-07 TCGA-A2-A3XV-01A-21R-A239-07 \
1580 1024.779160 29452.491771
1598 0.000000 0.000000
1995 551.221323 243.727431
2127 415.769586 551.508707
2819 10530.579870 2027.695619
... ... ...
现在,我需要的是,将两个列表中的数据帧连接成更小的数据帧,并为每个数据帧运行一个函数
假设我的功能是进行相关性分析
import pandas as pd
from scipy.stats import pearsonr
def correlation(df):
correlations = pd.DataFrame()
for PC in [column for column in df.columns if '_PC' in column]:
for lncRNA in [column for column in df.columns if '_lncRNAs' in column]:
correlations = correlations.append(pd.Series(pearsonr(df[PC],df[lncRNA]),index=['PCC', 'p-value'],name=PC + '_' +lncRNA))
我需要对上面列表中的每个连接数据帧使用上述函数。
例如,这就是我所尝试的
for dfs,dfs2 in zip(list_df1,list_df2):
#print(dfs.iloc[0:2,0:2],dfs2.iloc[0:2,0:2])
df = dfs
df2 = dfs2
DF = pd.concat([dfs,dfs2])
DF_T =DF.set_index("Gene_id").T
DF_T如下所示:
DF_T.shape()
(75, 1073)
但是,DF\u T
只是上面定义的两个列表(列表df1,列表df2)
中最后一个数据帧的串联。因此,如果我对数据帧DF_T
运行correlation
函数,它将仅对列表中的最后一个数据帧执行相关性分析。然而,我的目标是从两个列表中运行所有小的连接数据帧
因此,我正在寻找一种方法,可以分别从两个列表中提取所有数据帧。然后,将它们连接到不同的数据帧中。最后,对每个连接的数据帧应用correlation
函数。所有这些都是为了提高相关函数的性能和速度。我的输入是多个大数据帧
非常感谢您的帮助和建议 使用您自己的代码,应该可以:
def correlation(list_df1,list_df2):
correlations = pd.DataFrame()
for dfs,dfs2 in zip(list_df1,list_df2):
DF = pd.concat([dfs,dfs2])
df = DF.set_index("Gene_id").T
for PC in [column for column in df.columns if '_PC' in column]:
for lncRNA in [column for column in df.columns if '_lncRNAs' in column]:
correlations = correlations.append(pd.Series(pearsonr(df[PC],df[lncRNA]),index=['PCC', 'p-value'],name=PC + '_' +lncRNA))
return correlations
由于采用了简单的解决方案,拆分和级联的主要原因是降低了在相关分析函数中运行巨大数据帧的计算成本。目前,我正在尝试你的解决方案。它还没有完成。一旦我完成,我可以给你更新。同时,我想问一下,在转换数据帧之后,它是维度
(741200),(1223000),(5003000)
等等。其中,我当前的函数需要花费很长时间才能返回输出。我想有一些高效或更快的方法来完成这项任务。谢谢again@user1017373第一个循环是不可避免的。可以通过先过滤数据帧列,然后使用.corr()
函数计算列之间的成对相关性来替换内部循环。不过,不确定它是否会显著改进。感谢您的建议,我添加了一个过滤器,以在超过50%的列为0时删除行<代码>DF=DF[DF.平均值(轴=1)>=0.50]在相关函数之前。但是,它仍然在运行,因此,我无法更新是否作为一种成功的方法。通过过滤列,我的意思是df=df[column for column in df.columns if((“PC”in column)或(“lncRNAs”in column))]
,然后是类似df.corr()
的内容。我希望删除所有0行将更改相关性值。好的,我明白了。我不确定,我如何才能添加一个过滤器的系列。这里的df[PC]
和df[lncRNA]
是系列。如果你能给我举个例子,那就太好了?非常感谢。