使用相同的键,多个值追加到字典

时间:2019-01-15 14:54:05

标签: python pandas dictionary

试图了解最好的想法/做法是什么。.我在不同位置都有一个带有访调员的数据框。.我想创建一个字典或某种数据结构来保存访调员的姓名,然后保存每个坐标我们要接受他们的采访我正在使用的数据框的示例如下:

    interview       longitude        latitude
1   A1                  34.2             90.2
2   A1                  54.2             23.5
6   A1                  NaN              NaN
7   A2                  NaN              NaN
8   A2                  NaN              NaN
9   A2                  23.1             38.2
10  A2                  -23.7            -98.4

我实际上希望有一个字典,其中包含“ A1”,并且包含(34.2,90.2),(54.2,23.5),而“ A2”将包含(23.1,39.2),(-23.7,-98.4)。

    location_dict = {}
    for name, group in df.groupby('Interviewer'):
        minidf = group[['Interviewer','Longitude','Latitude']].dropna()
        for index, row in minidf.iterrows():
            location_dict[name]=(row['Longitude'], row['Latitude'])

我的逻辑有点过时,但是我没有任何“附加”到字典的方法,所以我的字典仅输出迭代的最后一次迭代中的数据...我将如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

使用groupby的一种解决方案:

def zipper(row):
    return list(zip(row['longitude'], row['latitude']))

res = df.dropna(subset=['longitude', 'latitude'])\
        .groupby('interview').apply(zipper).to_dict()

# {'A1': [(34.2, 90.2), (54.2, 23.5)],
#  'A2': [(23.1, 38.2), (-23.7, -98.4)]}

另一个使用collections.defaultdict

from collections import defaultdict

res = defaultdict(list)
for row in df.dropna(subset=['longitude', 'latitude']).itertuples(index=False):
    res[row.interview].append((row.longitude, row.latitude))

由于defaultdictdict的子类,因此通常不需要进一步的操作。