【问题标题】:How to convert a pandas dataframe into a list of multiple NamedTuple如何将熊猫数据框转换为多个 NamedTuple 的列表
【发布时间】:2019-11-25 08:01:38
【问题描述】:

我正在编写一个代码,我需要将多个 NamedTuple 映射到一个列表中。 下面是代码示例 - 我的主要问题是关于双 NamedTuple PeopleNamePeopleAge 的映射 List - 我不清楚如何做到这一点。应该分两步完成,1/ 将整行提取到通用 NamedTupe,然后 2/ 将记录拆分为不同的 NamedTuple PeopleNamePeopleAge

from typing import NamedTuple, List

import pandas as pd

data = [["tom", 10, "ab 11"], ["nick", 15, "ab 22"], ["juli", 14, "ab 11"]]
people = pd.DataFrame(data, columns=["Name", "Age", "PostalCode"])

PeopleName = NamedTuple("PeopleName", [("Name", str)])
PeopleAge = NamedTuple("PeopleAge", [("Age", int)])
PeoplePC = NamedTuple("PeoplePC", [("PostalCode", str)])

# The code below is not correct
Demography = NamedTuple(
    "Demography", [("names", List[(PeopleName, PeopleAge)]), ("postalcodes", PeoplePC)],
)


def to_nested_tuple(k, g):
    peoples = list(
        g["Name"].to_frame().itertuples(name="Person", index=False),
        # rec["Age"].to_frame().itertuples(name="PeopleAge", index=False),
    )
    return Demography(peoples, PeoplePC(k))


d = [to_nested_tuple(*item) for item in people.groupby("PostalCode")]

print(d)

【问题讨论】:

  • 你能否分享一些示例输出,我不完全确定我理解你想要做什么。

标签: python pandas tuples


【解决方案1】:

这个注解List[(PeopleName, PeopleAge)] 抛出TypeError: Too many parameters for typing.List; actual 2, expected 1

具有 2 种不同类型的元组也应该用 typing.Tuple 注释:

List[Tuple[PeopleName, PeopleAge]]

但是,要注释参数,最好使用抽象集合类型,例如 SequenceIterable

Demography = NamedTuple(
    "Demography", [("names", Sequence[Tuple[PeopleName, PeopleAge]]), ("postalcodes", PeoplePC)],
)

我不会为每个组应用to_nested_tuple,而是直接采用以下方式:

d = [Demography([(PeopleName(row['Name']), PeopleAge(row['Age'])) for _, row in group.iterrows()], PeoplePC(k))
     for k, group in people.groupby("PostalCode")] 

现在,结果将打印为:

[Demography(names=[(PeopleName(Name='tom'), PeopleAge(Age=10)), (PeopleName(Name='juli'), PeopleAge(Age=14))], postalcodes=PeoplePC(PostalCode='ab 11')),
 Demography(names=[(PeopleName(Name='nick'), PeopleAge(Age=15))], postalcodes=PeoplePC(PostalCode='ab 22'))]

【讨论】:

  • 谢谢,但是,最终结果看起来不正确,它不应该是PeopleNamePeopleAgePeoplePC 的每个公共邮政编码的tupe 列表吗?
  • 另外,你如何将这个带注释的序列转移到 pandas df 的输出中?
  • @Michael,“将此带注释的序列传输到输出中”是什么意思?我已经发布了你的最终声明的结果print(d)
  • 谢谢@RomanParekhrest - 在我的初始代码中 - 你如何将原始数据帧传输到序列中:def to_nested_tuple(k, g): peoples = list(g["Name"].to_frame().itertuples(name="Person", index=False),) return Demography(peoples, PeoplePC(k))
  • 谢谢,@RomanPerekhrest - 按预期工作 - 感谢您花时间更新您的答案!
【解决方案2】:

使用list(df.itertuples()),其中df 是您的数据框。

【讨论】:

  • 这是我想要做的,但是对于列表中的每个数据帧记录,我应该有一个到 PeopleAgePeopleName 的双重映射 - 最后我应该有一个 (@ 987654325@ 和 peopleName) 和一个对应的 PeoplePC 如果有意义的话
猜你喜欢
  • 2019-10-12
  • 2022-01-19
  • 2017-08-26
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
相关资源
最近更新 更多