我的目标是使用此数据集
mngr shares value ticker
0 JP Morgan 50 12 AAPL
1 AQR 120 12 AAPL
2 JP Morgan 5 30 GOOGL
3 JP Morgan 6 25 FB
4 AQR 10 30 GOOGL
5 AQR 12 25 FB
6 AQR 30 14 PG
创建另一个数据集,其中的值取自“shares”列:
AAPL GOOGL FB PG
JP Morgan 50 5 6 NaN
AQR 120 10 12 30
到目前为止,我有一个几乎完整的代码
import pandas as pd
import networkx as nx
import numpy as np
df = pd.DataFrame({'mngr': ['JP Morgan', 'AQR', 'JP Morgan', 'JP Morgan', 'AQR', 'AQR', 'AQR'], 'shares': [50, 120, 5, 6, 10, 12, 30],
'value': [12, 12, 30, 25, 30, 25, 14], 'ticker': ['AAPL', 'AAPL', 'GOOGL', 'FB', 'GOOGL', 'FB', 'PG']})
mngrlist = []
tickerlist = []
shareslist = []
for item in df.mngr.unique():
mngrlist.append(item)
for item in df.ticker.unique():
tickerlist.append(item)
for item in df.shares.unique():
shareslist.append(item)
print df
r = np.zeros((len(mngrlist), len(tickerlist)))*np.nan
df1 = pd.DataFrame(columns=tickerlist, data=r)
df1.index = mngrlist
for s in tickerlist:
for t in mngrlist:
tick = df['ticker'] == s
mn = df["mngr"] == t
df1[s][t] = df.loc[tick & mn, "shares"].values
print df1
但唯一的问题是这一行的最后一步
df1[s][t] = df.loc[tick & mn, "shares"].values
据我所知,这两个对象具有不同的维度(性质),但如果你打印出每个
df.loc[tick & mn, "shares"].values
它每个只有一个元素,我不知道如何将它转换为一个简单的浮点值。我也试过使用groupby,但没有成功。
另一个问题是,是否可以为此过程编写更有效的代码。我需要为大型数据集运行它,因此效率很重要。
答案 0 :(得分:5)
如果我理解正确,你想"pivot"原来的DF:
In [305]: df.pivot(index='mngr', columns='ticker', values='shares')
Out[305]:
ticker AAPL FB GOOGL PG
mngr
AQR 120.0 12.0 10.0 30.0
JP Morgan 50.0 6.0 5.0 NaN
可选地,我们可以删除轴名称:
In [307]: df.pivot(index='mngr', columns='ticker', values='shares') \
.rename_axis(None) \
.rename_axis(None,1)
Out[307]:
AAPL FB GOOGL PG
AQR 120.0 12.0 10.0 30.0
JP Morgan 50.0 6.0 5.0 NaN
答案 1 :(得分:4)
除了@MaxU几乎完美的解决方案之外的另一种方法是使用<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
和set_index
:
unstack
输出:
df.set_index(['mngr','ticker']).unstack(1)['shares']