Python 使用两个数据帧进行分组求和
我有两个非常大的数据帧,希望使用它们在快速求和操作中相互指导。这两个框架如下所示: 框架1:Python 使用两个数据帧进行分组求和,python,pandas,optimization,dataframe,sum,Python,Pandas,Optimization,Dataframe,Sum,我有两个非常大的数据帧,希望使用它们在快速求和操作中相互指导。这两个框架如下所示: 框架1: SampleName Gene1 Gene2 Gene3 Sample1 1 2 3 Sample2 4 5 6 Sample3 7 8 9 (实际上,Frame1大约是1000行x 300000列) 框架2: FeatureName GeneID Feature1
SampleName Gene1 Gene2 Gene3
Sample1 1 2 3
Sample2 4 5 6
Sample3 7 8 9
(实际上,Frame1大约是1000行x 300000列)
框架2:
FeatureName GeneID
Feature1 Gene1
Feature1 Gene3
Feature2 Gene1
Feature2 Gene2
Feature2 Gene3
(实际上,Frame2
约为350000行x 2列,具有17000个独特功能)
我想按Frame2的基因组对Frame1的列进行求和。例如,上述两个帧的输出将是:
SampleName Feature1 Feature2
Sample1 4 6
Sample2 10 15
Sample3 16 24
(实际上,输出大约为1000行x 17000列)
有没有办法以最小的内存使用量来实现这一点?您可以先创建列,然后按它创建列,最后创建列:
如果您想减少内存使用,我认为最好的选择是迭代第一个数据帧,因为它只有1k行
dfs = []
frame1 = frame1.set_index('SampleName')
for idx, row in frame1.iterrows():
dfs.append(frame2.join(row, on='GeneID').groupby('FeatureName').sum())
pd.concat(dfs, axis=1).T
屈服
FeatureName Feature1 Feature2
Sample1 4 6
Sample2 10 15
Sample3 16 24
一句讨厌的话
我可能做错了什么,但当我尝试您的代码时,第二行似乎失败了。错误最终返回为“TypeError:“str”对象不可调用“”-完整输出可在以下位置获得:运行良好,谢谢!此外,也是迄今为止我能运行的最快代码。:)唯一需要注意的是,我只使用了一个较小的数据集(Frame1为375x3731,Frame2为6040x2)对其进行了测试,因此我还不能对较大数据集的性能和内存使用情况发表评论。除此之外,它比上面的for循环方法快79.935倍。我使用
%memit
对较大的数据帧进行了测试,但没有成功。所以我对最好的解决方案很感兴趣。非常好的方法!我只使用了一个较小的数据集对其进行了测试,但我会尽快返回完整的测试用例。话虽如此,看来@jezrael至少在较小的数据集上拥有王冠。我会尽快带着完整的测试用例回来,谢谢!是的,如果它适合内存,最好使用矢量化的解决方案,而不是循环iterrows()
比一次应用要慢得多。不客气。:)
FeatureName Feature1 Feature2
Sample1 4 6
Sample2 10 15
Sample3 16 24
Frame1.set_index('SampleName') \
.rename_axis('GeneID', axis=1) \
.stack().rename('Value') \
.reset_index().merge(Frame2) \
.groupby(['SampleName', 'FeatureName']) \
.Value.sum().unstack()