使用列表中的标签将 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 数据框的主要内容,如果未能解决你的问题,请参考以下文章
Keras:ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型列表)
如何使用 SWIG 将 C++ 数组转换为 Python 列表?