【问题标题】:Creating multiples pandas dataframes as outputs of a function iteration over a list创建多个 pandas 数据帧作为函数迭代列表的输出
【发布时间】:2021-03-03 10:57:59
【问题描述】:

我正在尝试使用 pytaxize 包的函数 itis.hierarchy_full 来从特定 ID 中检索有关生物物种的信息。

该函数只接受一个值/Id,并将所有分类信息保存在我可以稍后编辑的 pandas 数据框中。

import pandas as pd
from pytaxize import itis
test1 = itis.hierarchy_full(180530, as_dataframe = True)

我有大约 800 个物种 ID,我想自动化该过程以获得 800 个不同的数据帧。

我以某种方式创建了一个包含一个小列表的测试(请注意,我是一名生物学家,所以代码非常基本并且可能效率低下:

species = [180530, 48739, 567823]

tx = {}
for e in species2:
    tx[e] = pd.DataFrame(itis.hierarchy_full(e, as_dataframe = True))

现在,如果我输入 tx(我使用的是 Jupyter Notebook),我将获得一个 pandas 数据帧字典(我认为它是一个嵌套字典)。如果我输入tx[180530],我将获得一个与我可以使用原始函数创建的数据帧完全相同的数据帧。

from pandas.testing import assert_frame_equal
assert_frame_equal(test_180530, sp_180530)

现在我可以编写一些东西来将存储在字典中的每个结果保存为单独的数据框:

sp_180530 = tx[180530]
sp_48739 = tx[48739]
sp_567823 = tx[567823]

有没有办法自动化这个过程并将每个数据帧保存到一个 sp_id?或者更好的是,有一种方法可以包含在我创建 tx 的原始函数中,以直接输出多个数据帧?

【问题讨论】:

  • 您这样做是为了达到什么目标?为什么要给数据框一个新的变量名而不是使用字典中的结果?
  • @NielsHenkens 我需要以不同的方式清理和存储每个数据帧(每个物种一个)。对于这个特定的项目,我需要水平清理和旋转每个数据框。 ITIS 数据是垂直存储的,但我需要数据框,其中我有一个值(物种名称),然后每一列是一个分类等级(一列来自属,一列用于类,依此类推)。我已经有 pandas 代码来清理、重新格式化和合并每个 df 到一个唯一的数据框,其中所有物种作为行,所有分类排名作为列。清洁过程适用于单个 df。
  • 为什么不循环遍历字典中的数据帧,将字典中的每个数据帧分配给一个(相同的)临时数据帧,清理/转换它,保存它并继续到下一个数据帧字典?我还没有真正看到需要为它们分配单独的变量名。
  • 老实说,我更喜欢使用带有字典的 pandas 数据框(尤其是嵌套字典对我来说是新的)。我将直接在嵌套的 dict 上尝试一些迭代,看看我可以在没有单个变量的情况下直接将它保存在 df 中。主要区别在于单曲 df 更“细化”。我可以发送或重新合并一个只有一些变量的 df,也许只从具有某个相似 ID 的物种创建一个 df,等等。在我看来,它更“笼统”。
  • 您实际上并不需要“使用字典”。您可以只使用字典中的单个数据框。有关示例,请参见下面的“答案”。你可以对df_temp(这只是一个熊猫数据框)做任何你需要做的事情,然后继续下一个......

标签: python pandas dataframe dictionary


【解决方案1】:

不完全是您所要求的,但能够详细说明如何处理字典中的数据帧...要使用字典,请遍历字典,然后一个接一个地使用每个包含的数据帧.. .

for key in tx.keys():
    df_temp = tx[key]

    # < do all your stuff to df_temp .....>

    # Save the dataframe as you want/need (I assume as csv for here)    
    df_temp.to_csv(f'sp_{key}.csv')

【讨论】:

  • 谢谢,我已经做到了,至少我已经在 csv 中保存了所有物种的完整分类。现在我要弄清楚如何优化代码,但这是一个很好的开始!
猜你喜欢
  • 2021-01-01
  • 2018-11-04
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
相关资源
最近更新 更多