Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用两个数据帧进行分组求和_Python_Pandas_Optimization_Dataframe_Sum - Fatal编程技术网

Python 使用两个数据帧进行分组求和

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

我有两个非常大的数据帧,希望使用它们在快速求和操作中相互指导。这两个框架如下所示:

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