我想知道如何编写更简洁的代码,因此我开始关注一些日常代码例程。我经常不得不遍历数据框以更新字典列表:
foo = []
for index, row in df.iterrows():
bar = {}
bar['foobar0'] = row['foobar0']
bar['foobar1'] = row['foobar1']
foo.append(bar)
我认为很难维护,因为如果更改df键,则该循环将无法进行。除此之外,为两个数据结构写相同的索引是一种代码重复。
上下文是,我经常对接收到字典列表的特定端点进行api调用。
我正在为该例程寻求改进,那么如何避免将索引分配更改为某些map和lambda技巧,以避免给定数据帧中的键更改所引起的错误(通常是由于数据库中的某些查询而导致)?
换句话说,如果数据库中的列名更改了,那么数据框的键也将改变,所以我想使用给定数据框的相同键快速创建字典,并用对应的数据框填充每个字典条目价值观。
我该怎么做?
答案 0 :(得分:0)
执行此操作的简单方法是https://angular.io/guide/dependency-injection-pattern,该方法带有一个orient
参数,您可以使用该参数指定如何构造结果的结构。
特别是,orient='records'
为您提供了一个记录列表,每个记录都是{col1name: col1value, col2name: col2value, ...}
格式的字典。
(您的问题有点令人困惑。最后,您说:“我想使用给定数据帧的相同键动态创建字典,并用数据帧对应的值填充每个字典条目。”听起来像是要列表的字典(即to_dict(orient='list')
或字典的字典(即to_dict(orient='dict')
或to_dict()
,因为这是默认值),而不是列表的字典
如果您想知道如何手动执行此操作(您实际上不希望这样做,但是值得理解):DataFrame
的行为就像字典,列名作为键,而系列作为值。因此,您可以像使用普通字典一样获得列名称的列表:
columns = list(df)
然后:
foo = []
for index, row in df.iterrows():
bar = {}
for key in keys:
bar[key] = row[key]
foo.append(bar)
或更紧凑地说:
foo = [{key: row[key] for key in keys} for _, row in df.iterrows()}]