根据唯一列键对数据进行分组并在 Pandas Python 中加入(数据透视表 table)
Grouping data on unique column keys and joining (pivot table) in Pandas Python
我是 pandas 和 python 的新手,正在尝试重塑 .csv 中提供的数据。数据的结构使得具有各自收盘价和日期的代码在同一列中是连续的。
例如:
TIC CLOSE
DATE
1984-01-03 0223B 25.37500
1984-01-04 0223B 25.75000
1984-01-05 0223B 25.75000
1983-12-30 0485B 21.37500
1984-01-03 0485B 21.37500
1984-01-04 0485B 22.50000
1983-12-30 0491B 17.75000
1984-01-03 0491B 17.50000
1984-01-04 0491B 17.62500
1983-12-30 3614B 74.25000
1984-01-03 3614B 73.25000
1984-01-04 3614B 76.00000
1993-07-01 3615B 47.25000
1993-07-02 3615B 47.25000
1993-07-06 3615B 46.40625
1983-12-30 3ABNKQ 4.75000
1984-01-03 3ABNKQ 5.00000
1984-01-04 3ABNKQ 5.62500
1983-12-30 3ACKH 55.25000
1984-01-03 3ACKH 54.50000
1984-01-04 3ACKH 55.25000
我想重塑数据,这样我就会有一个 pandas 数据框,其中每一列都是一个带有各自收盘价的代码,如果日期行键没有数据,它将有 NaN ('left' 加入)。
我试过这样的方法:
sp = pd.read_csv('D:\Stocks.csv')
sp = pd.DataFrame(sp)
sp.columns = ['TIC', 'DATE', 'CLOSE']
sp.index = pd.to_datetime(sp['DATE'])
sp = sp[['TIC', 'CLOSE']]
unique_tickers = sp['TIC'].unique()
s0 = sp[sp['TIC'] == unique_tickers[0]]
s0 = pd.DataFrame(s0['CLOSE'])
s1 = sp[sp['TIC'] == unique_tickers[1]]
s1 = pd.DataFrame(s1['CLOSE'])
s0s1 = pd.concat([s0, s1], axis = 1)
s0s1.columns = unique_tickers[0:2]
for i in range(len(unique_tickers)):
sx = sp[sp['TIC'] == unique_tickers[i]]
sx = pd.DataFrame(sx['CLOSE'])
s0s1 = pd.concat([s0s1, sx], axis = 1)
我想我可以破解上面的代码来让它工作,但我想还有一个更优雅的解决方案。有什么想法吗?
谢谢!
我找到了原始问题的解决方案(感谢 BrenBarn):
sp = sp.reset_index().pivot(index='DATE', columns="TIC", values="CLOSE")
但是当我 运行 它在更大的 .csv 上时,我 运行 进入以下错误,
ValueError: Index contains duplicate entries, cannot reshape
我试图通过尝试 sp.groupby('TIC') 然后获取所有唯一的 'Date' 行键来找到解决方案,但它可以找出语法..再次提供任何帮助不胜感激!
这是你想要的吗?
>>> d.reset_index().pivot(index='DATE', columns="TIC", values="CLOSE")
TIC 0223B 0485B 0491B 3614B 3615B 3ABNKQ 3ACKH
DATE
1983-12-30 NaN 21.375 17.750 74.25 NaN 4.750 55.25
1984-01-03 25.375 21.375 17.500 73.25 NaN 5.000 54.50
1984-01-04 25.750 22.500 17.625 76.00 NaN 5.625 55.25
1984-01-05 25.750 NaN NaN NaN NaN NaN NaN
1993-07-01 NaN NaN NaN NaN 47.25000 NaN NaN
1993-07-02 NaN NaN NaN NaN 47.25000 NaN NaN
1993-07-06 NaN NaN NaN NaN 46.40625 NaN NaN
我不得不使用 reset_index
因为 pivot
需要一个列作为索引(至少在 this bug 固定之前)。
我是 pandas 和 python 的新手,正在尝试重塑 .csv 中提供的数据。数据的结构使得具有各自收盘价和日期的代码在同一列中是连续的。
例如:
TIC CLOSE
DATE
1984-01-03 0223B 25.37500
1984-01-04 0223B 25.75000
1984-01-05 0223B 25.75000
1983-12-30 0485B 21.37500
1984-01-03 0485B 21.37500
1984-01-04 0485B 22.50000
1983-12-30 0491B 17.75000
1984-01-03 0491B 17.50000
1984-01-04 0491B 17.62500
1983-12-30 3614B 74.25000
1984-01-03 3614B 73.25000
1984-01-04 3614B 76.00000
1993-07-01 3615B 47.25000
1993-07-02 3615B 47.25000
1993-07-06 3615B 46.40625
1983-12-30 3ABNKQ 4.75000
1984-01-03 3ABNKQ 5.00000
1984-01-04 3ABNKQ 5.62500
1983-12-30 3ACKH 55.25000
1984-01-03 3ACKH 54.50000
1984-01-04 3ACKH 55.25000
我想重塑数据,这样我就会有一个 pandas 数据框,其中每一列都是一个带有各自收盘价的代码,如果日期行键没有数据,它将有 NaN ('left' 加入)。
我试过这样的方法:
sp = pd.read_csv('D:\Stocks.csv')
sp = pd.DataFrame(sp)
sp.columns = ['TIC', 'DATE', 'CLOSE']
sp.index = pd.to_datetime(sp['DATE'])
sp = sp[['TIC', 'CLOSE']]
unique_tickers = sp['TIC'].unique()
s0 = sp[sp['TIC'] == unique_tickers[0]]
s0 = pd.DataFrame(s0['CLOSE'])
s1 = sp[sp['TIC'] == unique_tickers[1]]
s1 = pd.DataFrame(s1['CLOSE'])
s0s1 = pd.concat([s0, s1], axis = 1)
s0s1.columns = unique_tickers[0:2]
for i in range(len(unique_tickers)):
sx = sp[sp['TIC'] == unique_tickers[i]]
sx = pd.DataFrame(sx['CLOSE'])
s0s1 = pd.concat([s0s1, sx], axis = 1)
我想我可以破解上面的代码来让它工作,但我想还有一个更优雅的解决方案。有什么想法吗?
谢谢!
我找到了原始问题的解决方案(感谢 BrenBarn):
sp = sp.reset_index().pivot(index='DATE', columns="TIC", values="CLOSE")
但是当我 运行 它在更大的 .csv 上时,我 运行 进入以下错误,
ValueError: Index contains duplicate entries, cannot reshape
我试图通过尝试 sp.groupby('TIC') 然后获取所有唯一的 'Date' 行键来找到解决方案,但它可以找出语法..再次提供任何帮助不胜感激!
这是你想要的吗?
>>> d.reset_index().pivot(index='DATE', columns="TIC", values="CLOSE")
TIC 0223B 0485B 0491B 3614B 3615B 3ABNKQ 3ACKH
DATE
1983-12-30 NaN 21.375 17.750 74.25 NaN 4.750 55.25
1984-01-03 25.375 21.375 17.500 73.25 NaN 5.000 54.50
1984-01-04 25.750 22.500 17.625 76.00 NaN 5.625 55.25
1984-01-05 25.750 NaN NaN NaN NaN NaN NaN
1993-07-01 NaN NaN NaN NaN 47.25000 NaN NaN
1993-07-02 NaN NaN NaN NaN 47.25000 NaN NaN
1993-07-06 NaN NaN NaN NaN 46.40625 NaN NaN
我不得不使用 reset_index
因为 pivot
需要一个列作为索引(至少在 this bug 固定之前)。