如何使用来自另一个DataFrame对象的数据创建Pandas DataFrame对象?

时间:2017-11-06 13:29:53

标签: 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     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,但没有成功。

另一个问题是,是否可以为此过程编写更有效的代码。我需要为大型数据集运行它,因此效率很重要。

2 个答案:

答案 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']