熊猫-从转换后的数据框中检索原始数据

时间:2019-03-13 11:30:04

标签: python pandas dataframe

我建立了一个数据框来保存随着时间推移股票指数中的股票,其步骤如下:

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。

谢谢您的帮助!

1 个答案:

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