我建立了一个数据框来保存随着时间推移股票指数中的股票,其步骤如下:
1)首先,我通过数据提供程序下载原始数据并存储在字典中
2)转换为数据框以获得:
constituent_pd = pd.DataFrame.from_dict(constituent, orient='index')
index col1 col2 col3 etc...
1/1/92 stockA stockB NA etc...
2/1/92 stockB stockC stockD etc...
3)使用以下代码转换为布尔数据框:
constituent_bol = pd.get_dummies(constituent_pd.stack()).max(level=0).astype(bool)
index stockA stockB stockC etc...
1/1/92 True True False etc...
2/1/92 False True True etc...
从那里,我一直在尝试找到一种快速更新我的表的方法。 为此,我需要将constitution_bin转换回其原始字典形式,将其与新的字典合并(以获取最新日期),然后重新开始整个过程。
step1 = constituent_bol.astype('int32')
step2 = step1[step1 ==1].stack().reset_index().drop(0,1).set_index('level_0')
1/1/92 stockA
1/1/92 stockB
etc...
而且我不知道如何重塑长的数据帧(例如componentary_pd),以便稍后获得一个dic。
谢谢您的帮助!
答案 0 :(得分:0)
函数max(level=0)
中的问题丢失了原始列的名称,因为它是按第一级汇总的。
如此关闭您所需的内容,可以使用GroupBy.cumcount
作为新列名称的计数器:
print (constituent_pd)
col1 col2 col3
index
1/1/92 stockA stockB NaN
2/1/92 stockB stockC stockD
print (pd.get_dummies(constituent_pd.stack()))
stockA stockB stockC stockD
index
1/1/92 col1 1 0 0 0
col2 0 1 0 0
2/1/92 col1 0 1 0 0
col2 0 0 1 0
col3 0 0 0 1
print (pd.get_dummies(constituent_pd.stack()).max(level=0))
stockA stockB stockC stockD
index
1/1/92 1 1 0 0
2/1/92 0 1 1 1
constituent_bol = pd.get_dummies(constituent_pd.stack()).max(level=0).astype(bool)
print (constituent_bol)
stockA stockB stockC stockD
index
1/1/92 True True False False
2/1/92 False True True True
step1 = constituent_bol.astype('int32')
step2 = step1[step1 == 1].stack().reset_index().drop(0,1)
step2 = step2.set_index(['index', step2.groupby('index').cumcount()])['level_1'].unstack()
print (step2)
0 1 2
index
1/1/92 stockA stockB NaN
2/1/92 stockB stockC stockD