按 pandas 数据框列的相同部分字符串分组
group by same partial string of pandas dataframe column
我有几个csv文件,每个文件包含一个月内的一个股票价格,并且有数百万条数据。
原始 csv 数据数据如下:
AA_Candy.csv
Index CompanyName Time Price
1 AA Candy 030101090355 1.78
2 AA Candy 030101091533 1.79
.......
333498 AA Candy 031231145556 2.18
BB_Cookie.csv
1 BB Cookie 030101090225 3.20
2 BB Cookie 030101090845 3.14
.......
391373 BB Cookie 031231145958 3.88
我使用 python 和 pandas 来处理数据,在我加载并合并一些数据文件后,现在我有一个数据框:
帧数:
Index CompanyName Time Price
1 AA Candy 030101090355 1.78
2 AA Candy 030101091533 1.79
.......
333498 AA Candy 031231145556 2.18
333499 BB Cookie 030101090225 3.20
333500 BB Cookie 030101090845 3.14
.......
712871 BB Cookie 031231145958 3.88
时间031231145958代表2013-12-3114:59:58
现在我想获取每个公司每小时的最高价和最终价,并得到一个输出文件,如:
range_start AA Candy/Max AA Candy/Close BB Cookie/Max BB Cookie/Close
0301010900 1.79 1.77 3.20 3.10
........
0312311400 2.24 2.18 3.88 3.88
所以我想通过CompanyName和Time的前8个字符进行分组,得到一个小时内同一家公司的数据,然后计算出每家公司的最高价格值和最终价格值并输出结果同一行开始时间相同;让 companyName/Max 或 Close 成为新的列名。
因为我是pandas和dataframe的新手,所以有以下问题:
- 如何根据Time Column(Object)的前8个字符对数据进行分组,然后得到我的期望值?
- 如何形成一个新的输出dataframe/matrix作为我的预期输出?
谢谢!!
对于你的第一个问题,你可以使用
df.groupby(df.Time.str[0:8])
对于你的第二个问题,unstack
应该是你想要的:
df.groupby(df.Time.str[0:8]).unstack()
对公司名称和字符串时间戳的前 8 个字符(即日期加小时)执行 groupby
。然后在价格上使用 agg
以获得每个(第一个、最大、最小和最后一个)的自定义函数。拆开公司名称,交换公司名称和 open/high/low/close 的级别,并可选择对符号进行排序。
gb = (df.groupby(['CompanyName', df.Time.str[:8]])
.Price
.agg({'open': 'first',
'high': np.max,
'low': np.min,
'close': 'last'})[['open', 'high', 'low', 'close']]
.unstack('CompanyName'))
gb.columns = gb.columns.swaplevel(0, 1)
>>> gb.sortlevel(level=0, axis=1)
CompanyName AA Candy BB Cookie
open high low close open high low close
Time
03010109 1.78 1.79 1.78 1.79 3.20 3.20 3.14 3.14
03123114 2.18 2.18 2.18 2.18 3.88 3.88 3.88 3.88
我有几个csv文件,每个文件包含一个月内的一个股票价格,并且有数百万条数据。 原始 csv 数据数据如下:
AA_Candy.csv
Index CompanyName Time Price
1 AA Candy 030101090355 1.78
2 AA Candy 030101091533 1.79
.......
333498 AA Candy 031231145556 2.18
BB_Cookie.csv
1 BB Cookie 030101090225 3.20
2 BB Cookie 030101090845 3.14
.......
391373 BB Cookie 031231145958 3.88
我使用 python 和 pandas 来处理数据,在我加载并合并一些数据文件后,现在我有一个数据框:
帧数:
Index CompanyName Time Price
1 AA Candy 030101090355 1.78
2 AA Candy 030101091533 1.79
.......
333498 AA Candy 031231145556 2.18
333499 BB Cookie 030101090225 3.20
333500 BB Cookie 030101090845 3.14
.......
712871 BB Cookie 031231145958 3.88
时间031231145958代表2013-12-3114:59:58
现在我想获取每个公司每小时的最高价和最终价,并得到一个输出文件,如:
range_start AA Candy/Max AA Candy/Close BB Cookie/Max BB Cookie/Close
0301010900 1.79 1.77 3.20 3.10
........
0312311400 2.24 2.18 3.88 3.88
所以我想通过CompanyName和Time的前8个字符进行分组,得到一个小时内同一家公司的数据,然后计算出每家公司的最高价格值和最终价格值并输出结果同一行开始时间相同;让 companyName/Max 或 Close 成为新的列名。
因为我是pandas和dataframe的新手,所以有以下问题:
- 如何根据Time Column(Object)的前8个字符对数据进行分组,然后得到我的期望值?
- 如何形成一个新的输出dataframe/matrix作为我的预期输出?
谢谢!!
对于你的第一个问题,你可以使用
df.groupby(df.Time.str[0:8])
对于你的第二个问题,unstack
应该是你想要的:
df.groupby(df.Time.str[0:8]).unstack()
对公司名称和字符串时间戳的前 8 个字符(即日期加小时)执行 groupby
。然后在价格上使用 agg
以获得每个(第一个、最大、最小和最后一个)的自定义函数。拆开公司名称,交换公司名称和 open/high/low/close 的级别,并可选择对符号进行排序。
gb = (df.groupby(['CompanyName', df.Time.str[:8]])
.Price
.agg({'open': 'first',
'high': np.max,
'low': np.min,
'close': 'last'})[['open', 'high', 'low', 'close']]
.unstack('CompanyName'))
gb.columns = gb.columns.swaplevel(0, 1)
>>> gb.sortlevel(level=0, axis=1)
CompanyName AA Candy BB Cookie
open high low close open high low close
Time
03010109 1.78 1.79 1.78 1.79 3.20 3.20 3.14 3.14
03123114 2.18 2.18 2.18 2.18 3.88 3.88 3.88 3.88