2015-06-15 17 views
0

我有以下數據框:大熊貓將列名的變量有效

{'2003-12-02LVDT0023': {0: 2.3407617000000001e-06, 
    1: 2.3402380999999998e-06, 
    2: 2.3410341000000001e-06, 
    3: 2.3417209999999999e-06, 
    4: 2.3419282000000002e-06, 
    5: 2.3420178e-06, 
    6: 2.3424012999999999e-06}, 
'2003-12-02LVDT0024': {0: 2.3612594999999998e-06, 
    1: 2.3609533999999999e-06, 
    2: 2.3611187000000002e-06, 
    3: 2.3618049e-06, 
    4: 2.3621773999999998e-06, 
    5: 2.3626039000000002e-06, 
    6: 2.3625455000000001e-06}, 
'2003-12-02LVDT0025': {0: 2.3660825000000001e-06, 
    1: 2.3660903000000001e-06, 
    2: 2.3659481000000001e-06, 
    3: 2.3661921e-06, 
    4: 2.3668378999999998e-06, 
    5: 2.3671985e-06, 
    6: 2.3679653999999999e-06}, 
'2003-12-02force0023': {0: 2.3664842999999999e-06, 
    1: 2.3664650000000002e-06, 
    2: 2.3666738999999999e-06, 
    3: 2.3665972999999999e-06, 
    4: 2.3670195e-06, 
    5: 2.3675174999999997e-06, 
    6: 2.3677449e-06}, 
'2003-12-02force0024': {0: 2.3680921e-06, 
    1: 2.3682342000000004e-06, 
    2: 2.3684212999999998e-06, 
    3: 2.3688697000000001e-06, 
    4: 2.3694958999999999e-06, 
    5: 2.3698856000000002e-06, 
    6: 2.3702362000000002e-06}, 
'2003-12-02force0025': {0: 2.3684941000000001e-06, 
    1: 2.3691163999999997e-06, 
    2: 2.3693348999999999e-06, 
    3: 2.3694661000000002e-06, 
    4: 2.3701970999999998e-06, 
    5: 2.3704627000000002e-06, 
    6: 2.3707437000000001e-06}} 

enter image description here

我想重塑數據框的方式,我做的對每個數據點一列(標題中的最後幾位)以及每個數據點兩個附加列(lvdtforce)。數據幀本身有40000行。

什麼部分地與這個小數據的工作原理是:

# I cannot use `inplace=True` here 
new = new.unstack().reset_index() 
new['id'] = new.level_0.str[-4:] 
new = new.convert_objects(convert_numeric=True) 
new 

enter image description here

這給了我列作爲新列的最後四位數字。從這裏開始,我可能會以某種方式重新塑造數據框。但是,在原始數據幀上執行此操作會產生15640000行新的數據幀,並消耗額外的1 GB RAM。

我要的是一個數據幀,如:

index force lvdt id 
0 0.002 0.002 23 
1 0.002 0.002 24 
+0

最後一張桌子是你想要的,而你只是希望它更有效率?或者你想要不同的東西?如果是後者,只需以文本/表格的形式寫出所需結果即可。 – JohnE

回答

0

這應該讓你至少接近數據幀你想要的:

  1. 與分級一個替換列索引:

    ind = [(t[0:10], t[10:-4], t[-2:]) for t in df.columns] 
    newcol = pd.MultiIndex.from_tuples(ind, names = ['date', 'factor', 'id']) 
    df.columns = newcol 
    
  2. 使用stack其次是reset_index到轉換dateid列標籤爲列:

    df = df.stack(level=['date', 'id']).reset_index([1,2]) 
    df.index = range(len(df)) 
    

最後一行給你一個唯一索引。你當然也可以使用一些有意義的東西。

+0

我設法解決它,但它需要大約2分鐘和3.2 GB的RAM用於中間計算。我會將其與您的方法進行比較。 – Moritz