我一直试图将来自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
我还在学习,所以我理解这可能是一个简单的问题。真诚的谢谢!!
答案 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