使用同一数据框中其他2个列的值从一个列创建2D列表

时间:2019-04-25 17:45:18

标签: python pandas list numpy dataframe

我有一个包含2列的数据框,它们代表需要创建的2D数组的X和Y维。 2D数组中的值将来自数据帧中的另一列。如果数据框中的值列超过1个,则需要创建相同数量的2D列表。

到目前为止,假设数据框中只有1个值列,我已经能够创建1个2D列表。我根据数据框中的X和Y列创建了一个相同尺寸的空2D列表。然后,我遍历数据帧的每一行,并根据该行中X和Y的值填充2D列表。

示例数据框。 X代表2D列表的“列”,Y代表2D列表的“行”。在这种情况下,2D列表为3x2。列(数字结果,电压)将填充2D列表。

people_id

首先,我创建2D列表:

person_name | pets_count
John        | 2
Mike        | 3
Joan        | 0
NULL        | 20

然后我填充列表。

      | parent | child | numeric_result | X | Y |
index |                |        voltage |
    0 |     xy |     a |            1.2 | 1 | 1 | 
    1 |     xy |     a |            1.1 | 2 | 1 |
    2 |     xy |     a |            1.2 | 3 | 1 | 
    3 |     xy |     a |            1.1 | 1 | 2 |
    4 |     xy |     a |            1.0 | 2 | 2 |
    5 |     xy |     a |            1.3 | 3 | 2 |

这似乎效率低下。有没有一种方法可以对此进行矢量化或以某种方式使其更快?

此外,我想创建一个新的数据框,如下所示,其中有许多父子组合。任何帮助将不胜感激如何创建此数据框。谢谢!

rows = 2
cols = 3    

def make2dList(rows, cols):    
    a=[]    
    for row in range(rows): a += [[0]*cols]    
    return a
list2d = make2dList(rows, cols)

这里编辑是我的代码,用于使用2D列表创建数据框。任何帮助将不胜感激,使其高效。

def fill2dlist(a, dataframe):
    # Loop through each row of dataframe 
    for i in range(len(dataframe.index)):
        col = int(dataframe.iloc[i].X)
        row = int(dataframe.iloc[i].Y)
        a[row-1][col-1] = (pd.to_numeric(dataframe.loc[i,'numeric_result'].values[0]))
    return a

finallist = modify2dlist(list2d, dataframe)
print(finallist)

[[1.2, 1.1, 1.2],[1.1, 1.0, 1.3]]

1 个答案:

答案 0 :(得分:0)

我通过使用多索引简化了2D列表生成过程。

yarray = np.arange(min(df.Y),max(df.Y)+1,1)
xarray = np.arange(min(df.X),max(df.X)+1,1)

idx = pd.MultiIndex.from_product([yarray, xarray], names=['Y', 'X'])

idx给出Y和X的所有笛卡尔组合。然后,我使用idx索引数据帧。下面的代码还将NaN填充在诸如父母和孩子之类的列中,我试图找出避免方法。

# https://stackoverflow.com/questions/43688938/pandas-insert-rows-where-data-is-missing$    
df1 = df.set_index(['Y', 'X']).reindex(idx) 

# https://stackoverflow.com/questions/38134012/pandas-dataframe-fillna-only-some-columns-in-place$    
df1['numeric_result'] = df1['numeric_result'].fillna(value=0)

在使用numpy整形之前,我使用Y和X索引对数据框进行排序。

df1= df1.sort_values(by=['Y','X'])
array = np.reshape(df1.numeric_result.values, (len(yarray,len(xarray)))