【问题标题】:StopIteration error when creating a dataframe from a dictionary从字典创建数据框时出现 StopIteration 错误
【发布时间】:2022-01-03 23:53:59
【问题描述】:

所以我从字典中创建了一个数据框来执行时间序列练习。当我创建数据框(我在 Google Colab 中执行此操作)时,单元格运行正常。但是当我这样做时full_df.head()。我收到StopIteration 错误。有谁知道为什么会这样?

这就是我所拥有的:

df = pd.read_csv('all_stocks_5yr.csv', usecols=["close", "Name"])

gp = df.groupby("Name")
my_dict = {} 
for record in gp: 
    if record[0] in my_dict:
       my_dict[record[0]].append(record)
    else:
       my_dict[record[0]] = [record]

full_df = pd.DataFrame.from_dict(my_dict, orient='index')

full_df.head() #This is where I get the error.

【问题讨论】:

  • 提供测试数据。
  • 我已经添加了字典的一部分@hpchavaz

标签: python dataframe csv dictionary


【解决方案1】:

它不起作用,因为您试图将元组分配为单列。

循环.groupby 的结果会产生一对(key, sub_df),其中key 是该组名。 sub_df 是一个 DataFrame,其中包含与给定 key 关联的所有列和所有值。您的循环为字典中的每个 key 创建一个元素列表(其中元素是提到的元组)。

这个字典将表示一个只有一列的 DataFrame(因为字典中的每个条目都是一个元素列表),每一行包含字符串和数据帧的元组。 Pandas 不知道如何将其转换为正确的 DataFrame。

如果我正确理解了意图,那么您希望在索引中包含名称并在每行中关闭值。为此,最好使用pivot() 函数。我找到了你的dataset 来尝试解决它。我建议加载date 列。您可以使用以下方法旋转加载的 DataFrame:

final_df = df.pivot(columns="date", index="Name", values="close")
final_df.head()

结果:

如果您无权访问date 列,则可以使用cumcount() 在每个组中分配递增的索引值。使用以下代码:

df['date'] = df.groupby('Name').cumcount()
final_df = df.pivot(columns="date", index="Name", values="close")
final_df.head()

你得到这个:

编辑:

如果你想使用字典,那么你需要小心你输入的值。由于df.groupby('Name') 返回元组的可迭代对象,因此我们可以将其解包为key, groupgroup 也是一个 DataFrame,因此我们需要选择列(在本例中为“关闭”)。我们需要将选定的列转换为 Numpy 数组(或重置索引),否则 Pandas 将使用group 索引作为新 DataFrame 中的列名。代码示例:

my_dict = {key: group['close'].to_numpy() for key, group in df.groupby('Name')}
full_df = pd.DataFrame.from_dict(my_dict, orient='index')
full_df.head()

返回:

【讨论】:

  • 我如何添加我创建的字典?还是最好删除字典并使用枢轴来完成?
  • 最好用pivot,而不是字典(免费的性能和干净的代码)。但是如果你想使用字典,我会在答案编辑中提供代码示例。
  • 是的,您也可以使用字典提供答案吗?如果不是很麻烦
  • 我已经添加了字典示例。清楚了吗?
  • 是的。如果您有 date 列,则可以将其分配为每个组中的索引,而不是使用 Numpy 数组。每个组中生成的 pandas Series 的索引将成为列名:my_dict = {key: group.set_index('date')['close'] for key, group in df.groupby('Name')}
猜你喜欢
  • 1970-01-01
  • 2023-01-03
  • 2019-11-16
  • 2021-12-30
  • 2021-03-08
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
相关资源
最近更新 更多