按列名称将数据框拆分为较小的数据框

Posted

技术标签:

【中文标题】按列名称将数据框拆分为较小的数据框【英文标题】:Split dataframe into smaller dataframe by column Names 【发布时间】:2022-01-02 02:12:24 【问题描述】:

所以我正在做一个时间序列/LSTM 作业,我有一个股票数据集:https://www.kaggle.com/camnugent/sandp500

问题是我需要按每家公司的名称将主数据框拆分为较小的数据框。有没有快速的方法来做到这一点?因为有几十个公司名称,我见过用iloc可以做到的,但是工作量太大了。

df = pd.read_csv('all_stocks_5yr.csv', parse_dates=['date'])
df['date'] = pd.to_datetime(df['date'])

grouped_df = df.groupby('Name')

这里可以看得更清楚:

如您所见,有不同名称的不同公司,我想要的是每个公司的数据框。非常感谢您的帮助

【问题讨论】:

您打算如何处理较小的数据帧?您可以尝试使用.set_index(['Name', 'date']),然后.groupby('Name') 应该会更快。 @athing 即使是索引列,您仍然可以按列分组。 @KevinRoche 是的,但是接下来他们需要更小的框架 @KevinRoche 您需要遍历 groupby obj 对吗?但它会使 Name index 已经有了,所以为什么要先设置索引 您的预期输出是什么?您的数据中有 505 家公司。例如,您不能只使用sample = df[df["Name"].eq("AAPL")] 访问您想要的任何公司吗? 【参考方案1】:

这应该可以通过布尔索引来实现:

list_of_dataframes = [
    df[df.Name == name]
    for name
    in df.Name.unique()
]

【讨论】:

这可行,但我想它在大型数据集上会很慢,因为您必须为每个唯一名称计算整个布尔系列。【参考方案2】:

假设这是您的数据框:

 Name  price
0   aal      1
1   aal      2
2   aal      3
3   aal      4
4   aal      5
5   aal      6
6   bll      7
7   bll      8
8   bll      9
9   bll      8
10  dll      7
11  dll     56
12  dll      4
13  dll      3
14  dll      3
15  dll      5

然后执行以下操作:

for Name, df in df.groupby('Name'):
    df.to_csv("Price_".format(Name)+".csv", sep=";")

这会将所有子数据帧保存为 csv。 查看代码的作用:

for Name, df in df.groupby('Name'):
    print(df)

返回:

Name  price
0  aal      1
1  aal      2
2  aal      3
3  aal      4
4  aal      5
5  aal      6
  Name  price
6  bll      7
7  bll      8
8  bll      9
9  bll      8
   Name  price
10  dll      7
11  dll     56
12  dll      4
13  dll      3
14  dll      3
15  dll      5

如果您需要在每个 df 中重置索引,请执行以下操作:

for Name, df in df.groupby('Name'):
    gf = df.reset_index()
    print(gf)

给出:

index Name  price
0      0  aal      1
1      1  aal      2
2      2  aal      3
3      3  aal      4
4      4  aal      5
5      5  aal      6
   index Name  price
0      6  bll      7
1      7  bll      8
2      8  bll      9
3      9  bll      8
   index Name  price
0     10  dll      7
1     11  dll     56
2     12  dll      4
3     13  dll      3
4     14  dll      3
5     15  dll      5

【讨论】:

数据集有一些字段如:open、high、low、close... df转csv时如何添加? @enekovalero 除了上面的代码,你不需要做任何事情。我的 df 只是一个例子。所有列都将在每个生成的数据框中。它仅按名称过滤。对于您未来的问题(或者如果您希望我测试您的实际数据),请不要发布图片。而是这样做:df.head(50).to_dict()(或任何数字而不是 50)并将结果粘贴到您的 SO-question 中的 ``` ``` 之间。 @eneko valero...我认为您的概念没有多大意义,或者任何意义。你能试试下面提到的概念吗?可能只有前 1/4 适用于您正在做的事情。 github.com/ASH-WICUS/Notebooks/blob/master/…

以上是关于按列名称将数据框拆分为较小的数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何将大数组拆分为较小的数组?

如何将列表拆分为较小的列表?

将庞大的 sql 表逻辑拆分为较小的表

根据开始和结束索引(保存在两个向量中)并使用条件将 data.frame 拆分为较小的 data.frame

尝试将列表拆分为较小的列表时出错

将列表拆分为较小的列表(分成两半)