从其他2个DataFrame中填充DataFrame

时间:2017-11-12 03:10:47

标签: python-2.7 pandas csv dataframe merge

我一直试图将来自2个数据帧的信息组合成一个新的数据帧而没有运气。我已经进行了广泛的搜索,但仍然找不到任何相关的答案,所以如果我在搜索中错过了它,请道歉。

在创建投资策略时,在大量货币(超过50种)中,我选择了前5种货币来投资每个日期(在 top_n.csv 中)及其各自的百分比在每个日期为每种货币投资的权重(在 weights.csv 中)。

top_n.csv 像:

Date               0         1         2      3        4
Aug 12, 2016    bitcoin  ethereum   0        0        0
Aug 11, 2016    bitcoin  ethereum   ripple  steem     litecoin
Aug 10, 2016    bitcoin  ethereum   ripple  0         0
Aug 09, 2016    bitcoin  ethereum   steem   ripple    ethereum-classic

weights.csv 像:

Date               0      1        2      3       4
Aug 12, 2016    0.859   0.089   nan     nan     nan
Aug 11, 2016    0.856   0.092   0.020   0.016   0.016
Aug 10, 2016    0.853   0.093   0.020   nan     nan
Aug 09, 2016    0.858   0.086   0.020   0.020   0.017

我试图填充的DataFrame是一个包含相同日期(在索引中)的数据框,但是有一些列对应于更大的一组硬币(超过50个),如 W.csv

是否有一种有效的方式(对于每个日期)将正确的权重填充到任何具有任何货币的货币,并将其他货币保留为0?棘手的部分是处理没有足够货币的日期(因此 top_n.csv 少于n种货币,而 weights.csv 在各自的位置都有nans)。

W.csv 像:

Date        bitcoin ethereum    bitcoin-cash    ripple  litecoin    dash    neo nem monero  ethereum-classic    iota    qtum    omisego lisk    cardano zcash   bitconnect  tether  stellar    ....
Aug 12, 2016    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0    ....
Aug 11, 2016    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0    ....
Aug 10, 2016    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0    ....
Aug 09, 2016    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0    ....

我的目标是生成一个看起来像 W_all_target 的DataFrame,我附加的数据框看起来不正确(我已经手动编辑了这个问题)。

我保存了三个指示性CSV,因为它有助于检查它们。 https://drive.google.com/open?id=1olx9ARI0XP5mqbqF1pfRfJyl9wIEWyZj

我还在学习,所以我理解这可能是一个简单的问题。真诚的谢谢!!

1 个答案:

答案 0 :(得分:1)

选项0
这是为了容纳零和nans

dates = top_n.index.repeat(top_n.shape[1])
currs = top_n.values.ravel()
wghts = weights.values.ravel()
mask = currs != '0'

reshaped = pd.Series(wghts[mask], [dates[mask], currs[mask]]).unstack(fill_value=0)

W.update(reshaped)

选项1

reshaped = pd.concat([d.stack() for d in [top_n, weights]], axis=1) \
  .reset_index(1, drop=True).set_index(0, append=True)[1].unstack(fill_value=0)

reshaped

0           bitcoin  ethereum  ethereum-classic  litecoin  ripple  steem
Date                                                                    
2016-08-09    0.858     0.086             0.017     0.000    0.02  0.020
2016-08-10    0.853     0.093             0.000     0.016    0.02  0.018
2016-08-11    0.856     0.092             0.000     0.016    0.02  0.016
2016-08-12    0.859     0.089             0.000     0.016    0.02  0.015

选项2

reshaped = pd.Series(
    weights.values.ravel(),
    [top_n.index.repeat(top_n.shape[1]), top_n.values.ravel()]
).unstack(fill_value=0)

reshaped

            bitcoin  ethereum  ethereum-classic  litecoin  ripple  steem
Date                                                                    
2016-08-09    0.858     0.086             0.017     0.000    0.02  0.020
2016-08-10    0.853     0.093             0.000     0.016    0.02  0.018
2016-08-11    0.856     0.092             0.000     0.016    0.02  0.016
2016-08-12    0.859     0.089             0.000     0.016    0.02  0.015

然后您应该能够使用

更新W
W.update(reshaped)

W

            bitcoin  ethereum  bitcoin-cash  ripple  litecoin  dash  neo  nem  monero  ethereum-classic  iota  qtum  omisego  lisk  cardano  zcash  bitconnect  tether  stellar
Date                                                                                                                                                                           
2016-08-12    0.859     0.089             0    0.02     0.016     0    0    0       0             0.000     0     0        0     0        0      0           0       0        0
2016-08-11    0.856     0.092             0    0.02     0.016     0    0    0       0             0.000     0     0        0     0        0      0           0       0        0
2016-08-10    0.853     0.093             0    0.02     0.016     0    0    0       0             0.000     0     0        0     0        0      0           0       0        0
2016-08-09    0.858     0.086             0    0.02     0.000     0    0    0       0             0.017     0     0        0     0        0      0           0       0        0