我想使用 2D numpy 数组创建一个新的单列熊猫数据帧。显然,每行都应包含 1D 列表。下面是一个简化的可重现示例。
import pandas as pd
import numpy as np
arr = np.ones((4,3)) # could be any 2D array
我想要的是,
lists
0 [1, 1, 1]
1 [1, 1, 1]
2 [1, 1, 1]
3 [1, 1, 1]
现在,df = pd.DataFrame(arr, columns=['lists'])
给出了错误,
ValueError: Shape of passed values is (4, 3), indices imply (4, 1)
df = pd.DataFrame(list(arr), columns=['lists'])
给出了错误,
ValueError: 1 columns passed, passed data had 3 columns
最后,df = pd.DataFrame(arr.flatten(), columns=['lists'])
给出了一个错误的数据帧,所有单元格都具有标量1
。
我如何得到我想要的?
data = {"lists": list(arr)}
df = pd.DataFrame(data, columns=['lists'])
print(df)
输出:
lists
0 [1.0, 1.0, 1.0]
1 [1.0, 1.0, 1.0]
2 [1.0, 1.0, 1.0]
3 [1.0, 1.0, 1.0]
从二维数组(即一维数组(的每一行构造一个包含该行的单例元组,并从中构建数据帧。我们可以使用生成器表达式优雅地做到这一点:
>>> df = pd.DataFrame(((x,) for x in arr), columns=['lists'])
>>> df
lists
0 [1.0, 1.0, 1.0]
1 [1.0, 1.0, 1.0]
2 [1.0, 1.0, 1.0]
3 [1.0, 1.0, 1.0]
构造函数循环访问元组,而不是基础数组,以确定给定行中的列值。有一个这样的值 - 1d 数组 - 因此该值存储在单个可用列中。
单元格值确实是 Numpy 数组:
>>> df['lists'][0]
array([1., 1., 1.])
获取数组的所有行,用它们创建数据帧。转置然后添加列名。
import pandas as pd
import numpy as np
# ones array
arr = np.ones((4,3), dtype=int)
# get all rows of the array transpose and add column name
df = pd.DataFrame([list(arr)]).T
df.columns = ['lists']
df