我刚开始学习pandas,因此可能会问一个非常愚蠢的问题。通常在pandas中初始化数据框是按列进行的,我会使用具有列名键和值为长度相同的类似列表对象的字典进行输入。
但我想以行为单位进行初始化,而不需要动态连接行。比如说我有一个nametuple的列表,是否有一种优化的操作可以直接将其转换成pandas数据框?
类似于从namedtuple创建Series,您可以使用_fields
属性:
In [11]: Point = namedtuple('Point', ['x', 'y'])
In [12]: points = [Point(1, 2), Point(3, 4)]
In [13]: pd.DataFrame(points, columns=Point._fields)
Out[13]:
x y
0 1 2
1 3 4
假设它们都是同一类型,在此示例中为所有Point
。
您需要的功能是from_records。
对于namedtuple
实例,除了传递具有命名元组列表之外,还必须将命名元组的_fields
属性作为参数传递给from_records
的columns
参数:
df = pd.DataFrame.from_records(
[namedtuple_instance1, namedtuple_instance2],
columns=namedtuple_type._fields
)
如果您有字典,您可以直接使用它
df = pd.DataFrame.from_records([dict(a=1, b=2), dict(a=2, b=3)])
为了简化之前的答案,显然没有必要指定._fields
。这看起来是不必要的。特别是如果所有输入元组都是相同类型的。这已在pandas==1.3.4中进行了测试。
> import collections
> Point = collections.namedtuple('Point', ['x', 'y'])
> points = [Point(1, 2), Point(3, 4)]
> pd.DataFrame(points)
x y
0 1 2
1 3 4
pd.DataFrame.from_records
,因为它专门为元组设计(也支持字典,但字典有自己的方法 pd.DataFrame.from_dict
),并且让我更加放心。我理解我所说的是主观的。 - user3613932