使用列表中的标签将 numpy 数组转换为 pandas 数据框

Posted

技术标签:

【中文标题】使用列表中的标签将 numpy 数组转换为 pandas 数据框【英文标题】:Convert numpy array to pandas dataframe with labels from list 【发布时间】:2022-01-22 15:34:20 【问题描述】:

请告知如何执行以下预变:

array = [1, 3, 2] (numpy.ndarray)

l1 = ['foo_qwe1_ert1', 'bar_qwe2_ert2', 'baz_qwe3_ert3'] (list)

我需要得到以下熊猫数据框:

Column1 Column2 Column3
foo qwe1 ert1
baz qwe3 ert3
bar qwe2 ert2

问题是列表包含从 0 到 30 的文本标签(格式:XXX_YYY_ZZZ)并且 numpy.array 具有形状(3536,)并包含从 0 到 30 的数字。我需要为数组中的每个数字分配标签并保存它作为熊猫数据框

【问题讨论】:

【参考方案1】:

首先使用DataFrame构造函数和split

df = pd.DataFrame([x.split('_') for x in l1], columns=['Column1', 'Column2', 'Column3'])
print (df)
  Column1 Column2 Column3
0     foo    qwe1    ert1
1     bar    qwe2    ert2
2     baz    qwe3    ert3

然后通过从最后一列提取最后一个整数来更改array 的顺序:

df.index = df['Column3'].str.extract('(\d+)$', expand=False).astype(int)
df = df.loc[array].reset_index(drop=True)
print (df)
  Column1 Column2 Column3
0     foo    qwe1    ert1
1     baz    qwe3    ert3
2     bar    qwe2    ert2

编辑:

array = np.array([1, 3, 2])
l1 = ['foo_qwe1_ert1', 'bar_qwe2_ert2', 'baz_qwe3_ert3'] 

L = [x.split('_') for x in l1]
a, b, c = L[0]
b = b.replace('1','')
c = c.replace('1','')
print (b, c)
qwe ert

out = [(y[0], f'bx', f'cx') for x, y in zip(array, L)]
print (out)
[('foo', 'qwe1', 'ert1'), ('bar', 'qwe3', 'ert3'), ('baz', 'qwe2', 'ert2')]

或者:

out = [(y[0], f'qwex', f'ertx') for x, y in zip(array, L)]
print (out)
[('foo', 'qwe1', 'ert1'), ('bar', 'qwe3', 'ert3'), ('baz', 'qwe2', 'ert2')]

df = pd.DataFrame(out, columns=['Column1', 'Column2', 'Column3'])
print (df)
  Column1 Column2 Column3
0     foo    qwe1    ert1
1     bar    qwe3    ert3
2     baz    qwe2    ert2

【讨论】:

谢谢,但问题是列表包含从 0 到 30 的文本标签(格式:XXX_YYY_ZZZ)并且 numpy.array 具有形状(3536,)并包含从 0 到 30 的数字。我需要分配数组中每个数字的标签并将其保存为熊猫数据框 @AndreyAndrey - 这个新的样本数据是否可能改变问题? @AndreyAndrey - 不确定是否理解,所以需要array 的cretae 输入列表?就像在 EDIT 中一样?【参考方案2】:

您可以使用str.split,然后使用reindex

df = pd.Series(l1).str.split('_', expand=True)
df.index = [1,2,3]
df = df.reindex(array).reset_index(drop=True).rename(columns=i:'Column'+str(i+1) for i in df.columns)

输出:

  Column1 Column2 Column3
0     foo    qwe1    ert1
1     baz    qwe3    ert3
2     bar    qwe2    ert2

【讨论】:

以上是关于使用列表中的标签将 numpy 数组转换为 pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章

将元组中的列表转换为numpy数组?

Keras:ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型列表)

如何使用 SWIG 将 C++ 数组转换为 Python 列表?

将 2d numpy 数组转换为列表列表 [重复]

尝试将列表转换为 numpy 数组时出现 KeyError:0

Numpy:将标签转换为索引