2016-01-02 26 views
1

我有一個數據幀稱爲raw_df如何連接pandas.DataFrames列

columns = ['force0', 'distance0', 'force1', 'distance1'] 

raw_data = [{'force0': 1.2, 'distance0': 0.0, 'force1': 0.5, 'distance1': 0.0}, 
      {'force0': 1.3, 'distance0': 0.1, 'force1': 0.6, 'distance1': 0.0}, 
      {'force0': 1.4, 'distance0': 0.2, 'force1': 0.7, 'distance1': 0.3}, 
      {'force0': 1.5, 'distance0': 0.5, 'force1': 0.8, 'distance1': 0.6}] 

raw_df = pd.DataFrame(raw_data, columns=columns) 

raw_df看起來是這樣的:

force0 distance0 force1 distance1 
0  1.2  0.0  0.5  0.0 
1  1.3  0.1  0.6  0.0 
2  1.4  0.2  0.7  0.3 
3  1.5  0.5  0.8  0.6 

目前沒有指標,但我想的距離列合併爲一個索引,所以列是:

  force0 force1 
distance     
0.0   1.2  0.5 
0.0   NaN. 0.6 
0.1   1.3  NaN 
0.2   1.4  NaN 
0.3   NaN  0.7 
0.5   1.5  NaN 
0.6   NaN  0.8 

請注意,distance1 = 0.0時force1中有2個條目。

索引(距離)不應該排序:它們增加然後可變地減少,並且每個測試的原始順序是重要的。

Stefan對我描述不清的問題發表了一個驚人的答案,但它似乎用其他數字填補了任何失蹤的力量(這會誤導人,因爲這些測試中沒有對這些距離進行力測量)。我使用np.nan作爲缺失值,因爲我認爲這是pandas所做的。

我認爲mergejoin可能會做我所需要的但不能理解的the docs

也許pandas.DataFrame不是爲這樣的數據,我應該使用numpy.genfromtxt代替,只是選擇我需要在飛行中的列:我看不出有任何優勢,使用上飛一個pandas.DataFrame,如果我選擇列(因爲在這種情況下我沒有使用索引)。

感謝您的任何幫助。

+2

如果要處理原始數據幀的示例,會不錯。 –

+0

你的'test_ids'是什麼? 「距離1」,「距離2」等所有值都是唯一的嗎? –

+0

test_ids只是與測試編號對應的整數列表。例如,第一個是1,如在力1中 – blokeley

回答

0

我解決了使用MultiIndex DataFrame問題:使用pd.read_csv()

  • 結合DataFrames

    1. 閱讀每個測試到一個單獨的數據幀到一個使用df = pd.concat(frame_list, keys=test_names)

    而不是寫在這裏長描述,我寫了a Jupyter notebook這個主題,比較了MultiIndex方法和保持DataFrame的標準Python列表。

  • 1

    如果我理解正確的話,你是從一個類似的情況開始:

    columns = list(sum(list(zip(['Forces{}'.format(i) for i in range(4)], ['Distances{}'.format(i) for i in range(4)])),())) 
    df = pd.DataFrame(np.random.randint(1, 11, size=(100, 8)), columns=columns) 
    
        Forces0 Distances0 Forces1 Distances1 Forces2 Distances2 Forces3 \ 
    0  3   5  8   3  7   4  2 
    1  1   4  10   9  9   3  6 
    2  10   3  1   3  3   7  8 
    3  2   1  3   6  10   10  10 
    4  4   2  9   1  3   10  8 
    
        Distances3 
    0   8 
    1   5 
    2   3 
    3   8 
    4   8 
    

    和你的目標是有各種Distance列形成一個index而相應Forcecolumns remain in place. You could stack`的幀像這樣:

    df.set_index([c for c in df.columns if c.startswith('Force')], inplace=True) 
    df = df.stack().reset_index(level=-1, drop=True).reset_index().rename(columns={0: 'Distance'}) 
    df.set_index(['Distance'], inplace=True) 
    

    獲得:

      Forces0 Forces1 Forces2 Forces3 
    Distance          
    9    7  4  6  7 
    9    7  4  6  7 
    1    7  4  6  7 
    6    7  4  6  7 
    5    1  2  3  1 
    
    +0

    哇。這看起來非常好。我不需要MultiIndex,但看起來不錯。我今晚晚些時候我的孩子們在牀上時會進行測試。謝謝 – blokeley

    +0

    有沒有創建MultiIndex的捷徑? – blokeley

    +1

    已更新,所以沒有'MultiIndex'。 '.stack()'自動創建額外的'列',所以我就放棄了它。 – Stefan