按列名称将数据框拆分为较小的数据框
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 中的 ``` 以上是关于按列名称将数据框拆分为较小的数据框的主要内容,如果未能解决你的问题,请参考以下文章