Python 如何使用另一个DataFrame对象中的数据创建DataFrame对象?
我的目标是使用这个数据集Python 如何使用另一个DataFrame对象中的数据创建DataFrame对象?,python,pandas,dataframe,Python,Pandas,Dataframe,我的目标是使用这个数据集 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 2
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
要创建另一个数据集,其中的值取自列共享:
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,但没有成功
另一个问题是,是否有可能为此过程编写更高效的代码。我需要为一个大数据集运行它,因此效率很重要。如果我理解正确,您希望原始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
如果我理解正确,您希望使用原始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
除了@MaxU近乎完美的解决方案之外,另一种方法是使用set_index和unstack: 输出:
ticker AAPL FB GOOGL PG
mngr
AQR 120.0 12.0 10.0 30.0
JP Morgan 50.0 6.0 5.0 NaN
除了@MaxU近乎完美的解决方案之外,另一种方法是使用set_index和unstack: 输出:
ticker AAPL FB GOOGL PG
mngr
AQR 120.0 12.0 10.0 30.0
JP Morgan 50.0 6.0 5.0 NaN
为什么我这么晚才回答这个问题?@Bharath,还有一两个选择-是的,我们可以使用交叉表,但pivot是正确的方法。非常感谢,伙计们!所有评论都是superhelpful@AnnaIgnashkina,很高兴有帮助:为什么我这么晚才回答这个问题?@Bharath,还有一两个选择-是的,我们可以使用交叉表,但pivot是正确的方法。非常感谢,伙计们!所有评论都是superhelpful@AnnaIgnashkina,很高兴它有帮助: