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,很高兴它有帮助: