【发布时间】: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