数据框迭代用于值分配的更好做法

时间:2018-06-28 13:48:08

标签: python python-3.x pandas

我想知道如何编写更简洁的代码,因此我开始关注一些日常代码例程。我经常不得不遍历数据框以更新字典列表:

foo = []
for index, row in df.iterrows():
        bar = {}
        bar['foobar0'] = row['foobar0']
        bar['foobar1'] = row['foobar1']
        foo.append(bar)

我认为很难维护,因为如果更改df键,则该循环将无法进行。除此之外,为两个数据结构写相同的索引是一种代码重复。

上下文是,我经常对接收到字典列表的特定端点进行api调用。

我正在为该例程寻求改进,那么如何避免将索引分配更改为某些map和lambda技巧,以避免给定数据帧中的键更改所引起的错误(通常是由于数据库中的某些查询而导致)?

换句话说,如果数据库中的列名更改了,那么数据框的键也将改变,所以我想使用给定数据框的相同键快速创建字典,并用对应的数据框填充每个字典条目价值观。

我该怎么做?

1 个答案:

答案 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()}]