如何创建具有一个索引键列和多个值列的字典

Posted

技术标签:

【中文标题】如何创建具有一个索引键列和多个值列的字典【英文标题】:how to create a dictionary with one index key column and multiple value columns 【发布时间】:2019-10-30 00:14:21 【问题描述】:

我有一个包含 3 列 A、B、C 的数据框 df。我希望 A 列作为索引和键,B 和 C 列作为 A 的值。

我尝试了以下方法:

def cellDict():

    df_set_index('A')['B','C']
    x= df.set_index('A')['B']
    y= df.set_index('A')['C']
    z= zip(x,y)


def getCellDetails():
    try:
        cellDB_DF= pd.read_excel('cell_DB.xlsx')
        cellLatDB= cellDB_DF['Latitude'].to_dict()
        cellLongDB= cellDB_DF['Longitude'].to_dict()
        cellDict= cellDF.set_index('Cell_ID')['Latitude']['Longitude'].to_dict()
        print cellDict

    except Exception as e:
        print e.message

例外结果是这样的

dfcellID=('latitude','longitude')

【问题讨论】:

首先初始化,mydict = dict() 然后只是构建一个循环逻辑: for : mydict[cellID] = (x, y) 【参考方案1】:
# Sample data.
df = pd.DataFrame('A': [1, 2, 3], 'B': [100, 200, 300], 'C': [400, 500, 600])
>>> df
   A    B    C
0  1  100  400
1  2  200  500
2  3  300  600

然后使用字典推导:

>>> key: (a, b) for key, a, b in df.values
1: (100, 400), 2: (200, 500), 3: (300, 600)

根据@piRSquared 的建议,您还可以转置数据帧,然后使用to_dict 函数指定list 作为方向变量。

df.set_index('A').T.to_dict('list')

他的另一个建议提供了一个非常有效的解决方案:

dict(zip(df.A, zip(df.B, df.C)))

时间安排 (Python 3.7 with pandas 0.24.2)

# Set-up 10k row dataframe.
df = pd.DataFrame('A': range(10000), 'B': range(10000), 'C': range(10000))

# Method 1
%timeit -n 10 key: (a, b) for key, a, b in df.values
# 14.8 ms ± 3.62 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

# Method 2
%timeit -n 10 df.set_index('A').T.to_dict('list')
# 520 ms ± 41.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

# Method 3
%timeit -n 10 dict(zip(df.A, zip(df.B, df.C)))
# 7.7 ms ± 3.32 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

# Method 4
%timeit -n 10 k: (a, b) for k, a, b in zip(*map(df.get, df))
# 9.61 ms ± 3.81 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

【讨论】:

在我的手机上,所以我无法验证我的答案?“dict(zip(df.A, zip(df.B, df.C)))”。或“df.set_index(‘A’).T.to_dict(‘list’)” @piRSquared 您的两个解决方案都有效。第一个非常有效(方法 3),第二个似乎相当慢(方法 2)。我正在使用 Python 3.7.3 和 pandas 0.24.2 进行测试。 我怀疑这应该加快你的速度:“k: (a, b) for k, a, b in zip(*map(df.get, df))”

以上是关于如何创建具有一个索引键列和多个值列的字典的主要内容,如果未能解决你的问题,请参考以下文章

创建 2 个具有相同键列但不同包含列的非聚集索引

具有包含性列的索引

创建带包含列的索引 sqlserver

具有多个值列的数据透视表

索引键列和包含性列

MySQL创建数据表并建立主外键关系