【问题标题】:Creating a 2D list from a column using values from 2 other columns in the same dataframe使用同一数据框中其他 2 列的值从列创建 2D 列表
【发布时间】:2019-09-15 05:19:30
【问题描述】:

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

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

示例数据框。 X 代表 2D 列表的“列”,Y 代表 2D 列表的“行”。在这种情况下,2D 列表是 3x2。列 (numeric_result, voltage) 将填满 2D 列表。

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

首先我创建 2D 列表:

rows = 2
cols = 3    

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

然后我填充列表。

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]]

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

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

      | parent | child |                numeric_result_list |
index |                |                            voltage |
    0 |     xy |     a | [[1.2, 1.1, 1.2], [1.1, 1.0, 1.3]] | 
    1 |     xy |     b | [[1.1, 1.0, 1.1], [1.4, 1.3, 1.5]] |       
    2 |     xy |     c | [[1.1, 1.0, 1.6], [1.4, 1.8, 1.5]] |               
    3 |     yz |     e | [[1.4, 1.2, 1.2], [1.7, 1.2, 1.0]] |

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

# Create an empty dataframe with column names
dffinal = pd.DataFrame(columns=['parent','child','numeric_result_list'])

# Group by 'parent' and 'child'
parent_child = df2.groupby(['parent', 'child'])

i = 1
for name, group in parent_child:

    print('Processing: ', name)
    group = group.reset_index(drop=True)

    _array2d_ = make2dList(rows, cols)
    _array2d_ = modify2dlist(_array2d_, _group_)

    dffinal.loc[i] = [name[0], name[1], _array2d_]
    i = i+1
    print('done')

dff = dff.reset_index(drop=True)

【问题讨论】:

    标签: python pandas list numpy dataframe


    【解决方案1】:

    我通过使用多索引简化了 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 填充到诸如 parent & child 之类的列中,我试图弄清楚如何避免。

    # 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 reshape 之前,我使用 Y 和 X 索引对数据框进行排序。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多