所以我有DataFrame
,我将列标记为a - i。我想创建一个Dictionary of Dictionaries
,其中外键是列" a",内键是列" d",值是" e&#34 ;。我知道如何通过迭代每一行来做到这一点,但我觉得有一种更有效的方法可以使用DataFrame.to_dict()
来做到这一点,但我无法弄清楚如何......也许DataFrame.group_by
可能有所帮助,但似乎用于分组列或索引ID。
如何有效地使用pandas
(或numpy
)创建Dictionary of Dictionaries
而不遍历每一行?我已经展示了我当前方法的一个示例以及所需的输出应该在下面。
#!/usr/bin/python
import numpy as np
import pandas as pd
tmp_array = np.array([['AAA', 86880690, 86914111, '22RV1', 2, 2, 'H', '-'], ['ABA', 86880690, 86914111, 'A549', 2, 2, 'L', '-'], ['AAC', 86880690, 86914111, 'BFTC-905', 3, 3, 'H', '-'], ['AAB', 86880690, 86914111, 'BT-20', 2, 2, 'H', '-'], ['AAA', 86880690, 86914111, 'C32', 2, 2, 'H', '-']])
DF = pd.DataFrame(tmp_array,columns=["a,b,c,d,e,g,h,i".split(",")])
#print(DF)
a b c d e g h i
0 AAA 86880690 86914111 22RV1 2 2 H -
1 ABA 86880690 86914111 A549 2 2 L -
2 AAC 86880690 86914111 BFTC-905 3 3 H -
3 AAB 86880690 86914111 BT-20 2 2 H -
4 AAA 86880690 86914111 C32 2 2 H -
from collections import defaultdict
from itertools import izip
D_a_d_e = defaultdict(dict)
for a,d,e in izip(DF["a"],DF["d"],DF["e"]):
D_a_d_e[a][d] = e
#print(D_a_d_e)
#ignore the defaultdict part
defaultdict(<type 'dict'>, {'ABA': {'A549': '2'}, 'AAA': {'22RV1': '2', 'C32': '2'}, 'AAC': {'BFTC-905': '3'}, 'AAB': {'BT-20': '2'}})
我看到了这个https://stackoverflow.com/questions/28820254/how-to-create-a-pandas-dataframe-using-a-dictionary-in-a-single-column,但它有点不同,也没有答案。
答案 0 :(得分:4)
有to_dict
方法:
In [11]: DF.to_dict()
Out[11]:
{'a': {0: 'AAA', 1: 'ABA', 2: 'AAC', 3: 'AAB', 4: 'AAA'},
'b': {0: '86880690', 1: '86880690', 2: '86880690' 3: '86880690', 4: '86880690'},
'c': {0: '86914111', 1: '86914111', 2: '86914111', 3: '86914111', 4: '86914111'},
'd': {0: '22RV1', 1: 'A549', 2: 'BFTC-905', 3: 'BT-20', 4: 'C32'},
'e': {0: '2', 1: '2', 2: '3', 3: '2', 4: '2'},
'g': {0: '2', 1: '2', 2: '3', 3: '2', 4: '2'},
'h': {0: 'H', 1: 'L', 2: 'H', 3: 'H', 4: 'H'},
'i': {0: '-', 1: '-', 2: '-', 3: '-', 4: '-'}}
In [12]: DF.to_dict(orient="index")
Out[12]:
{0: {'a': 'AAA', 'b': '86880690', 'c': '86914111', 'd': '22RV1', 'e': '2', 'g': '2', 'h': 'H', 'i': '-'},
1: {'a': 'ABA', 'b': '86880690', 'c': '86914111', 'd': 'A549', 'e': '2', 'g': '2', 'h': 'L', 'i': '-'},
2: {'a': 'AAC', 'b': '86880690', 'c': '86914111', 'd': 'BFTC-905', 'e': '3', 'g': '3', 'h': 'H', 'i': '-'},
3: {'a': 'AAB', 'b': '86880690', 'c': '86914111', 'd': 'BT-20', 'e': '2', 'g': '2', 'h': 'H', 'i': '-'},
4: {'a': 'AAA', 'b': '86880690', 'c': '86914111', 'd': 'C32', 'e': '2', 'g': '2', 'h': 'H', 'i': '-'}}
考虑到这一点,你可以做groupby:
In [21]: DF.set_index("d").groupby("a")[["e"]].apply(lambda x: x["e"].to_dict())
Out[21]:
a
AAA {'C32': '2', '22RV1': '2'}
AAB {'BT-20': '2'}
AAC {'BFTC-905': '3'}
ABA {'A549': '2'}
dtype: object
那就是说,你可以使用直接的MultiIndex而不是字典词典:
In [31]: res = DF.set_index(["a", "d"])["e"]
In [32]: res
Out[32]:
a d
AAA 22RV1 2
ABA A549 2
AAC BFTC-905 3
AAB BT-20 2
AAA C32 2
Name: e, dtype: object
它的工作方式大致相同:
In [33]: res["AAA"]
Out[33]:
d
22RV1 2
C32 2
Name: e, dtype: object
In [34]: res["AAA"]["22RV1"]
Out[34]: '2'
但是你会更节省空间/你还在熊猫里。
答案 1 :(得分:0)
这些方面的东西:
def dictmaker(df):
"""
wrapper for storing key, values in dict. Takes df.
"""
dct={} ## storage
dct[df.d.values[0]]=df.e.values[0]
return dct
DF[['a','d','e']].groupby('a').apply(dictmaker)
a
AAA {u'22RV1': u'2'}
AAB {u'BT-20': u'2'}
AAC {u'BFTC-905': u'3'}
ABA {u'A549': u'2'}
dtype: object