Pandas:从命名元组列表创建数据框

44

我刚开始学习pandas,因此可能会问一个非常愚蠢的问题。通常在pandas中初始化数据框是按列进行的,我会使用具有列名键和值为长度相同的类似列表对象的字典进行输入。

但我想以行为单位进行初始化,而不需要动态连接行。比如说我有一个nametuple的列表,是否有一种优化的操作可以直接将其转换成pandas数据框?

3个回答

42

类似于从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


41

您需要的功能是from_records

对于namedtuple实例,除了传递具有命名元组列表之外,还必须将命名元组的_fields属性作为参数传递给from_recordscolumns参数:

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)])

1
那个链接已经失效了。一个简短的演示也会大大提高这个答案的质量。 - jpmc26

8

为了简化之前的答案,显然没有必要指定._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

1
我试过了,它更简单。但我仍然更喜欢使用 pd.DataFrame.from_records,因为它专门为元组设计(也支持字典,但字典有自己的方法 pd.DataFrame.from_dict),并且让我更加放心。我理解我所说的是主观的。 - user3613932

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接