Python 如何从df.itertuples()启用带namedTupper Pandas的行[col_name]语法
我们有一个包含许多列的数据帧,需要使用df.itertuples()在行中循环。许多列名位于变量中,使用getattr()访问namedtuplePython 如何从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):
行
可以很好地工作,但对于许多列访问来说可读性不强。有没有办法启用行[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'])