如何将单个数据行创建为pandas.core.frame.Pandas object
因此,当您使用for row in df.itertuples()迭代一个dataframe (df)时,每一行都将是一个pandas.core.frame.Pandas对象。我想要创建一个这种类型的对象。
例如:
import pandas as pd
d = [{'a': 1, 'b': 2}]
df = pd.DataFrame(d)
print(type(df))
print("a", df.a)
for row in df.itertuples():
print(type(row))
print("a", row.a)
myrow = None
df = pd.DataFrame(d)
for row in df.itertuples():
myrow = row
print(type(myrow))
print("a", myrow.a)其产出是:
<class 'pandas.core.frame.DataFrame'>
a 0 1
Name: a, dtype: int64
<class 'pandas.core.frame.Pandas'>
a 1
<class 'pandas.core.frame.Pandas'>
a 1正如您所看到的,pandas.core.frame.DataFrame的行为与预期的pandas.core.frame.Pandas不同。
我真的不想像上面那样创建myrow,所以我想知道如何更有效地/直接地创建这个对象。假设我只有一个要转换为pandas.core.frame.Pandas对象的数据列表
发布于 2021-09-15 01:35:33
解释:
itertuples的每一次迭代都会给出如下所示的对象:
Pandas(Index=0, a=1, b=2)Pandas只是itertuples name参数的默认名称,例如:
>>> help(df.itertuples)
Help on method itertuples in module pandas.core.frame:
itertuples(index=True, name='Pandas') method of pandas.core.frame.DataFrame instance
Iterate over DataFrame rows as namedtuples.
Parameters
----------
index : bool, default True
If True, return the index as the first element of the tuple.
name : str or None, default "Pandas"
The name of the returned namedtuples or None to return regular
tuples.默认名称是Pandas。这只是namedtuple的名字。
如果您更改了该名称,类型将变得不同:
for row in df.itertuples(name='newname'):
print(row)
print(type(row))
print("a", row.a)输出:
newname(Index=0, a=1, b=2)
<class 'pandas.core.frame.newname'>
a 1复制:
这是namedtuple的默认行为,例如:
>>> from collections import namedtuple
>>> a = namedtuple('Pandas', ['x', 'y', 'z'])
>>> a(1, 2, 3)
Pandas(x=1, y=2, z=3)
>>> type(_)
<class '__main__.Pandas'>
>>> 如您所见,它的类型是Pandas,它是该namedtuple的类型名称,因此itertuples不会给出Pandas对象,而只是itertuples namedtuple输出的默认设置名称。
文件参考资料:
正如collections.namedtuple文档中提到的那样:
返回名为typename的新元组子类。新的子类用于创建类似元组的对象,这些对象具有可通过属性查找访问的字段以及可索引和可迭代的字段。子类的实例还有一个有用的docstring (带有typename和field_names)和一个有用的
__repr__()方法,它以name=value格式列出元组内容。
如您所见,它创建了一个新类型。
发布于 2021-09-15 01:40:24
为了更好地理解这件事,我检查了源代码。它似乎只是传递给collections.namedtuple()工厂的默认名称,以创建一个名为tuple的工厂。这个线路也强调了我说的话。
这里有一个有趣的例子来证明我所说的:
import pandas as pd
d = [{'a': 1, 'b': 2}]
df = pd.DataFrame(d)
print(type(df))
print("a", df.a)
for row in df.itertuples():
print(type(row))
print("a", row.a)
myrow = None
df = pd.DataFrame(d)
for row in df.itertuples(name="user"):
myrow = row
print(type(myrow))
print("a", myrow.a)输出
<class 'pandas.core.frame.DataFrame'>
a 0 1
Name: a, dtype: int64
<class 'pandas.core.frame.Pandas'>
a 1
<class 'pandas.core.frame.user'>
a 1https://stackoverflow.com/questions/69185981
复制相似问题