对不起,如果以前已经问过这个问题,我进行了快速搜索,没有看到任何东西。
我有一个数据框:
Density
1212e 0.076014
1212f 0.210480
1212g 0.175493
1212h 0.176658
1212i 0.163813
1212l 0.138801
1212m 0.125144
1212o 0.118789
1212p 0.167668
1212q 0.106552
321aa 0.173623
321dd 0.215807
321ee 0.184621
321l 0.177182
321m 0.162529
321n 0.208383
321o 0.207479
321q 0.200622
321y 0.088065
321z 0.150651
和字典:
animals = {'5992' :('1212e', '1212f', '1212g', '1212h', '1212i'),
'6894' : ('321l', '321m', '321n', '321o', '321p', '321q'),
'5866' : ('1212l', '1212m', '1212n', '1212o', '1212p', '1212q'),
'6137' : ("321aa", '321dd', '321ee', '321y', '321z') }
我的最终目标是创建一个多层索引,该层索引使用来自动物的键作为顶层,并使用来自我的数据框的关联项作为第二层。
类似:
Density
5992 1212e 0.076014
1212f 0.210480
1212g 0.175493
1212h 0.176658
1212i 0.163813
是否有一个很好的pythonic方法,我正在考虑创建一个新列,将其设置为关闭索引,然后将该新列设置为更高的索引。但是,这似乎有些round回,我宁愿学习如何编写一些更简洁的代码,有什么建议吗?
谢谢!
答案 0 :(得分:2)
您可以重写animals
字典并使用df.map
inv_animals = {i: int(k) for k, v in animals.items() for i in v}
这为您提供了一个从code
到animal
数字的映射
{'1212e': 5992,
'1212f': 5992,
'1212g': 5992,
'1212h': 5992,
'1212i': 5992,
'321l': 6894,
'321m': 6894,
'321n': 6894,
'321o': 6894,
'321p': 6894,
'321q': 6894,
'1212l': 5866,
'1212m': 5866,
'1212n': 5866,
'1212o': 5866,
'1212p': 5866,
'1212q': 5866,
'321aa': 6137,
'321dd': 6137,
'321ee': 6137,
'321y': 6137,
'321z': 6137}
然后只需使用df.map
并设置索引
df['animal'] = df.code.map(inv_animals)
df.set_index(['animal', 'code'])
density
animal code
5992 1212e 0.076014
1212f 0.210480
1212g 0.175493
1212h 0.176658
1212i 0.163813
5866 1212l 0.138801
1212m 0.125144
1212o 0.118789
1212p 0.167668
1212q 0.106552
6137 321aa 0.173623
321dd 0.215807
321ee 0.184621
6894 321l 0.177182
321m 0.162529
321n 0.208383
321o 0.207479
321q 0.200622
6137 321y 0.088065
321z 0.150651
答案 1 :(得分:0)
df = pd.read_table(io.StringIO(""" Density
1212e 0.076014
1212f 0.210480
1212g 0.175493
1212h 0.176658
1212i 0.163813
1212l 0.138801
1212m 0.125144
1212o 0.118789
1212p 0.167668
1212q 0.106552
321aa 0.173623
321dd 0.215807
321ee 0.184621
321l 0.177182
321m 0.162529
321n 0.208383
321o 0.207479
321q 0.200622
321y 0.088065
321z 0.150651"""), delim_whitespace=True)
df = df.reset_index()
df.columns = ["code", "density"]
然后简单
df["g"] = None
for k,v in nimals.items():
df.loc[df.code.isin(v), "g"] = k
df.set_index(["g", "code"])
density
g code
5992 1212e 0.076014
1212f 0.210480
1212g 0.175493
1212h 0.176658
1212i 0.163813
5866 1212l 0.138801
1212m 0.125144
1212o 0.118789
1212p 0.167668
1212q 0.106552
6137 321aa 0.173623
321dd 0.215807
321ee 0.184621
6894 321l 0.177182
321m 0.162529
321n 0.208383
321o 0.207479
321q 0.200622
6137 321y 0.088065
321z 0.15065
答案 2 :(得分:0)
使用带有多索引联接的方法:
dict = {'Density': {'1212e': 0.076014,'1212f': 0.210480,
'1212g': 0.175493,'1212h': 0.176658,'1212i': 0.163813,'1212l': 0.138801,'1212m': 0.125144,'1212o': 0.118789,'1212p': 0.167668,
'1212q': 0.106552,'321aa': 0.173623,'321dd': 0.215807,
'321ee': 0.184621,'321l': 0.177182,'321m': 0.162529,'321n': 0.208383,
'321o': 0.207479,'321q': 0.200622,'321y': 0.088065,'321z': 0.150651}}
df1 = pd.DataFrame(dict)
df1.index.name = 'id'
animals = {'5992' :('1212e', '1212f', '1212g', '1212h', '1212i'),
'6894' : ('321l', '321m', '321n', '321o', '321p', '321q'),
'5866' : ('1212l', '1212m', '1212n', '1212o', '1212p', '1212q'),
'6137' : ("321aa", '321dd', '321ee', '321y', '321z') }
l = []
for k,v in animals.iteritems():
l.extend (pd.MultiIndex.from_product([[k],v]))
idx = pd.MultiIndex.from_tuples(l)
idx.names = ['key','id']
df2 = pd.DataFrame(index = idx)
df2.join(df1)
Density
key id
5866 1212l 0.138801
1212m 0.125144
1212n NaN
1212o 0.118789
1212p 0.167668
1212q 0.106552
6894 321l 0.177182
321m 0.162529
321n 0.208383
321o 0.207479
321p NaN
321q 0.200622
6137 321aa 0.173623
321dd 0.215807
321ee 0.184621
321y 0.088065
321z 0.150651
5992 1212e 0.076014
1212f 0.210480
1212g 0.175493
1212h 0.176658
1212i 0.163813