首页 > 解决方案 > 如何将具有重复索引的堆叠列转换为具有熊猫的多个唯一列?

问题描述

我正在使用一个加密货币时间序列数据集,该数据集具有垂直堆叠的所有不同货币。它有日期、货币和价格 3 列。每种货币的日期范围也不同。

IE

>>> df
        Currency  Date    Price
0       0x        2017-08-16  0.111725
1       0x        2017-08-17  0.211486
2       0x        2017-08-18  0.283789
3       0x        2017-08-19  0.511434
4       0x        2017-08-20  0.429522
...     ...       ...         ...
657311  zurcoin   2018-02-04  0.003254
657312  zurcoin   2018-02-05  0.002774
657313  zurcoin   2018-02-06  0.001986
657314  zurcoin   2018-02-09  0.002684
657315  zurcoin   2018-02-10  0.002325

相反,我需要为每种货币的价格和日期设置一列,作为仅具有唯一日期的索引。会有很多空值我打算用 0 替换。

IE

date          0x_price  10mtoken_price  1337coin_price  ...
2017-08-16    1         4               (NaN)->0        ...
2017-08-17    2         5               (NaN)->0        ...
2017-08-18    3         6               7               ...
...           ...       ...             ...             ...

我尝试使用 groupby 遍历数据框,如下所示:

df2 = pd.DataFrame()
df2["date"] = df["Date"].unique()
df2.set_index("date", inplace=True)

for currency, group in df.groupby("Currency"):
df2.loc[df2.index.isin(group.Date), f"{currency}_price"] = group["Price"]

这返回了所需的列名和形状,但数据框填充了 NaN。

IE

date          0x_price  10mtoken_price  1337coin_price  ...
2017-08-16    NaN       NaN             NaN             ...
2017-08-17    NaN       NaN             NaN             ...
2017-08-18    NaN       NaN             NaN             ...
...           ...       ...             ...             ...

我还尝试使用 df.join() 实现相同的目标,如下所示:

df2 = pd.DataFrame()
df2["date"] = df["Date"].unique()
df2.set_index("date", inplace=True)

for currency, group in df.groupby("Currency"):
df2 = df2.join(group.set_index("Date")[["Price"]].rename(columns={"Price": f"{currency}_price"}))

在冻结我的计算机之前,这并没有完成执行。也许它效率低下,我正在处理大约 650,000 个条目?

我在这里找不到相同类型的问题,并且在查看文档后我也无法找到解决方案。我可能错过了一些东西,但希望我已经充分描述了这个问题。提前致谢。

标签: pythonpandas

解决方案


熊猫pivot_table可以在这里提供帮助。我会使用:

resul = df.pivot_table(index=['Date'], columns=['Currency'], values=['Price']).fillna(0)

使用您的示例数据,它给出:

               Price          
Currency          0x   zurcoin
Date                          
2017-08-16  0.111725  0.000000
2017-08-17  0.211486  0.000000
2017-08-18  0.283789  0.000000
2017-08-19  0.511434  0.000000
2017-08-20  0.429522  0.000000
2018-02-04  0.000000  0.003254
2018-02-05  0.000000  0.002774
2018-02-06  0.000000  0.001986
2018-02-09  0.000000  0.002684
2018-02-10  0.000000  0.002325

推荐阅读