我有以下
pandas
数据框
import pandas as pd
a = [2.5,3.3]
b = [3.6,3.9]
D = {'A': a, 'B': b}
这给了我类似的东西
+---+-----+-----+
| | A | B |
+---+-----+-----+
| 0 | 2.5 | 3.3 |
| 1 | 3.6 | 3.9 |
+---+-----+-----+
我想将此数据帧转换为结构化数组,例如
data = np.rec.array([
('A', 2.5),
('A', 3.6),
('B', 3.3),
('B', 3.9),
], dtype = [('Type','|U5'),('Value', '<i8')])
我没能找到一种方法来实现这一点,因为我是熊猫新手。我尝试过
pd.to_records
但索引妨碍了我,我找不到解决方法。
如有任何帮助,我们将不胜感激。谢谢。
A
和B
(列索引)成为一列。
要摆脱数字索引,请将此新列设为索引。然后拨打to_records()
:
import pandas as pd
a = [2.5,3.3]
b = [3.6,3.9]
D = {'A': a, 'B': b}
df = pd.DataFrame(D)
result = (pd.melt(df, var_name='Type', value_name='Value')
.set_index('Type').to_records())
print(repr(result))
产量
rec.array([('A', 2.5), ('A', 3.3), ('B', 3.6), ('B', 3.9)],
dtype=[('Type', 'O'), ('Value', '<f8')])
这是关键步骤:
In [167]: df
Out[167]:
A B
0 2.5 3.6
1 3.3 3.9
In [168]: pd.melt(df)
Out[168]:
variable value
0 A 2.5
1 A 3.3
2 B 3.6
3 B 3.9
一旦熔化了 DataFrame,
to_records
(基本上)就会返回所需的结果:
In [169]: pd.melt(df).to_records()
Out[169]:
rec.array([(0, 'A', 2.5), (1, 'A', 3.3), (2, 'B', 3.6), (3, 'B', 3.9)],
dtype=[('index', '<i8'), ('variable', 'O'), ('value', '<f8')])
对我有用,不会融化
pandas版本:1.5.2,numpy版本:1.23.5,python 3.10.4
records = df.to_records(index=False)
data = np.array(records, dtype = records.dtype.descr)
np.rec.fromrecords(list(zip(df.melt().variable,df.melt().value)))
Out[531]:
rec.array([('A', 2.5), ('A', 3.3), ('B', 3.6), ('B', 3.9)],
dtype=[('f0', '<U1'), ('f1', '<f8')])
你可以融化并调用to_records:
pd.melt(df).to_records(index=False)
这些都不适合我,当我尝试对 ndarray 执行任何操作时,我收到如下错误:
Cannot cast array data from dtype((numpy.record, [('14', '<f8'), ('15', '<f8'), ('16', '<f8'), ....
起作用的是用于转换为 numpy 的 pandas 内置函数!
data = df.to_numpy(dtype='float')