Python 如何从df.itertuples()启用带namedTupper Pandas的行[col_name]语法

Python 如何从df.itertuples()启用带namedTupper Pandas的行[col_name]语法,python,pandas,namedtuple,Python,Pandas,Namedtuple,我们有一个包含许多列的数据帧,需要使用df.itertuples()在行中循环。许多列名位于变量中,使用getattr()访问namedtuple行可以很好地工作,但对于许多列访问来说可读性不强。有没有办法启用行[col\u name]语法?例如,有一个子类名为tuple,比如这里 在下面的Frame类中包装row,这是一种解决方案,但不是真正的pythonic解决方案 class Frame: def __init__(self, namedtuple: NamedTuple):

我们有一个包含许多列的数据帧,需要使用df.itertuples()在行中循环。许多列名位于变量中,使用getattr()访问namedtuple
可以很好地工作,但对于许多列访问来说可读性不强。有没有办法启用
行[col\u name]
语法?例如,有一个子类名为tuple,比如这里

在下面的
Frame
类中包装
row
,这是一种解决方案,但不是真正的pythonic解决方案

class Frame:
    def __init__(self, namedtuple: NamedTuple):
        self.namedtuple = namedtuple

    def __getattr__(self, item):
        return getattr(self.namedtuple, item)

    def __getitem__(self, item):
        return getattr(self.namedtuple, item)
使用

输出

2
4
1
2
3
4
如果要保留这两种符号,一种可能的方法是:

def iterdicts(tuples):
    yield from ((tup, tup._asdict()) for tup in tuples)


df = pd.DataFrame([{'a': 1, 'b': 2}, {'a': 3, 'b': 4}])
for tup, row in iterdicts(df.itertuples()):
    print(tup.a)
    print(row[col_name])
输出

2
4
1
2
3
4

与您的方法类似,只需使用
df.iterrows()


这些行是使用pandas版本0.20.3和1.0.1测试的。

行有什么问题。_asdict()[col_name],或者更好地将其保存到一个新变量并使用它?我想您已经发现:
row。用dict解决问题的方法是不可能的。我们在列中总是有不同的数据类型,这就是为什么我忘记在我的问题中指定它(现在将添加它)。这也是我们从不使用ItErrorws()的原因,因为它会释放数据类型。这两个选项都很有效,谢谢。这主要是一个关于提高可读性的问题,我认为这两个问题都在同一个层面上。
import pandas as pd

df = pd.DataFrame([{'a': 1, 'b': 2}, {'a': 3,'b': 4}])
for index, row in df.iterrows():
    print(row.b) 
    print(getattr(row, 'b')) 
    print(row['b'])