簡體   English   中英

通過調整從元組列表中獲取的索引來創建數據框

[英]Creating dataframe by adjusting the index taken from list of tuples

我試圖從下面的元組列表中創建一個數據框。 元組中的第一項是ID ,第二個values是值列表,第三個是lag 這個lag定義了我需要在第一個元組的任一方向上移動多少索引才能獲取數據幀。

mytup = [(111, [1,2,3,4,5], 0), (222, [33,44,55,66], 2), (333, [0,11,22,33], -1)]


ID  values           lag
111 1,2,3,4,5        0
222 33,44,55,66      2
333 0,11,22,33      -1

下面給出了作為數據框創建的結果。 第一行是此數據幀中的標題。 lag總是參考第一列( 111 )。

111 222 333
nan nan 0
1   nan 11
2   nan 22
3   33  33
4   44  nan
5   55  nan
nan 66  nan

我要填充數據框的方法是從第一個元組開始。 然后,我從其余的一個元組中取出一個元組,並在引入nan的數據幀中進行填充。

一旦看到第二個元組,我將在數據框中使用它:

111    222
1   nan
2   nan
3   33
4   44
5   55
nan 66

第三元組的負滯后值為-1 ,因此我希望先前的數據幀向下移動一個位置並創建最終的數據幀,然后再次進行復制。

111 222 333
nan nan 0
1   nan 11
2   nan 22
3   33  33
4   44  nan
5   55  nan
nan 66  nan

編輯:

正如@cphlewis指出的那樣,輸出將取決於列添加的順序。 在我的情況下,滯后總是相對於第一個(原始)向量。 因此,無論順序如何,最終結果都將保持不變。

使用此命令(來自pandas.Series文檔字符串):

系列(+,-,/,*,**)之間的運算根據其關聯的索引值對齊值-它們的長度不必相同。 結果索引將是兩個索引的排序聯合。

import pandas as pd
from numpy import arange
#mytup = [(111, [1,2,3,4,5], 0), (222, [33,44,55,66], 2), (333, [0,11,22,33], -1)]
mytup = [(111, [1,2,3,4,5], 0),
         (222, [33,44,55,66], 2),
         (444, [1,2,3,4,5], 0),
         (333, [0,11,22,33], -1),
         ('a', [5,6,7], -2)]

def SfromTuple(row):
    name, data, shift = row
    return pd.Series(data, index = arange(shift, len(data) + shift))

reindexed = pd.concat([SfromTuple(row) for row in mytup], axis=1)
reindexed.columns = [x[0] for x in mytup]
print(reindexed)

來自原始mytup結果:

 0 111 222 333 -1 NaN NaN 0 0 1 NaN 11 1 2 NaN 22 2 3 33 33 3 4 44 NaN 4 5 55 NaN 5 NaN 66 NaN 

從上面添加的更長的mytup

 0 111 222 444 333 a -2 NaN NaN NaN NaN 5 -1 NaN NaN NaN 0 6 0 1 NaN 1 11 7 1 2 NaN 2 22 NaN 2 3 33 3 33 NaN 3 4 44 4 NaN NaN 4 5 55 5 NaN NaN 5 NaN 66 NaN NaN NaN 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM