循环分组 pandas df 并导出单个图

Loop over grouped pandas df and export individual plots

The documentation 似乎有点稀疏,至于每个元素是如何工作的,所以这里是:

我有一堆文件,我想为每个文件迭代并导出一个图。

df_all.head()

Returns

    Dem-Dexc    Aem-Dexc    Aem-Aexc    S       E     fit     frame filename
0   18150.0595  18548.2451  15263.7451  0.7063  0.5054  0.879   1.0 Traces_exp22_tif_pair16.txt
1   596.9286    7161.7353   1652.8922   0.8244  0.9231  0.879   2.0 Traces_exp22_tif_pair16.txt
2   93.2976     3112.3725   2632.6667   0.5491  0.9709  0.879   3.0 Traces_exp22_tif_pair16.txt
3   1481.1310   4365.4902   769.3333    0.8837  0.7467  0.879   4.0 Traces_exp22_tif_pair16.txt
4   583.1786    6192.6373   1225.5392   0.8468  0.9139  0.879   5.0 Traces_exp22_tif_pair16.txt

现在我想分组和迭代:

for group in df_all.groupby("filename"):
    plot = sns.regplot(data = group, x = "Dem-Dexc", y = "frame")

但我得到 TypeError: tuple indices must be integers or slices, not str。为什么我会得到这个?

我认为你需要改变:

for group in df_all.groupby("filename")

至:

for i, group in df_all.groupby("filename"):
    plot = sns.regplot(data = group, x = "Dem-Dexc", y = "frame")

用于解压缩 tuples

或 select 元组的第二个值 [1]:

for group in df_all.groupby("filename"):
    plot = sns.regplot(data = group[1], x = "Dem-Dexc", y = "frame")

您可以通过以下方式检查 tuple 输出:

for group in df_all.groupby("filename"):
    print (group)

('Traces_exp22_tif_pair16.txt',      Dem-Dexc    Aem-Dexc    Aem-Aexc       S       E    fit  frame  \
0  18150.0595  18548.2451  15263.7451  0.7063  0.5054  0.879    1.0   
1    596.9286   7161.7353   1652.8922  0.8244  0.9231  0.879    2.0   
2     93.2976   3112.3725   2632.6667  0.5491  0.9709  0.879    3.0   
3   1481.1310   4365.4902    769.3333  0.8837  0.7467  0.879    4.0   
4    583.1786   6192.6373   1225.5392  0.8468  0.9139  0.879    5.0   

                      filename  
0  Traces_exp22_tif_pair16.txt  
1  Traces_exp22_tif_pair16.txt  
2  Traces_exp22_tif_pair16.txt  
3  Traces_exp22_tif_pair16.txt  
4  Traces_exp22_tif_pair16.txt  )

对比:

for i, group in df_all.groupby("filename"):
    print (group)

     Dem-Dexc    Aem-Dexc    Aem-Aexc       S       E    fit  frame  \
0  18150.0595  18548.2451  15263.7451  0.7063  0.5054  0.879    1.0   
1    596.9286   7161.7353   1652.8922  0.8244  0.9231  0.879    2.0   
2     93.2976   3112.3725   2632.6667  0.5491  0.9709  0.879    3.0   
3   1481.1310   4365.4902    769.3333  0.8837  0.7467  0.879    4.0   
4    583.1786   6192.6373   1225.5392  0.8468  0.9139  0.879    5.0   

                      filename  
0  Traces_exp22_tif_pair16.txt  
1  Traces_exp22_tif_pair16.txt  
2  Traces_exp22_tif_pair16.txt  
3  Traces_exp22_tif_pair16.txt  
4  Traces_exp22_tif_pair16.txt  

如果要保存输出到图片png:

for i, group in df_all.groupby("filename"):
    plot = sns.regplot(data = group, x = "Dem-Dexc", y = "frame")
    fig = plot.get_figure()
    fig.savefig("{}.png".format(i.split('.')[0]))