![](/img/trans.png)
[英]Creating a list in a Dataframe column which is a range of values from other two data frame columns
[英]Creating a 2D list from a column using values from 2 other columns in the same dataframe
我有一个带有2列的数据框,它们代表需要创建的2D数组的X和Y维。 2D数组中的值将来自数据帧中的另一列。 如果数据框中的值列超过1个,则需要创建相同数量的2D列表。
到目前为止,假设数据框中只有1个值列,我已经能够创建1个2D列表。 我根据数据框中的X和Y列创建了一个相同尺寸的空2D列表。 然后,我遍历数据帧的每一行,并根据该行中X和Y的值填充2D列表。
示例数据框。 X代表2D列表的“列”,Y代表2D列表的“行”。 在这种情况下,2D列表为3x2。 列(numeric_result,电压)将填充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)
我通过使用多索引简化了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)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.