2017-02-16 2 views
2

Учитывая это DataFrame:Панды: создать словарь со списком столбцов, значения

import pandas as pd 
first=[0,1,2,3,4] 
second=[10.2,5.7,7.4,17.1,86.11] 
third=['a','b','c','d','e'] 
fourth=['z','zz','zzz','zzzz','zzzzz'] 
df=pd.DataFrame({'first':first,'second':second,'third':third,'fourth':fourth}) 
df=df[['first','second','third','fourth']] 

    first second third fourth 
0  0 10.20  a  z 
1  1 5.70  b  zz 
2  2 7.40  c zzz 
3  3 17.10  d zzzz 
4  4 86.11  e zzzzz 

Я могу создать словарь из df используя

a=df.set_index('first')['second'].to_dict() 

, так что я могу решить, что keys и что такое values. Но что, если вы хотите, чтобы список столбцов, например second AND third?

Если бы я попробовать этот

b=df.set_index('first')[['second','third']].to_dict() 

я получаю странный словарь словарей

{'second': {0: 10.199999999999999, 
    1: 5.7000000000000002, 
    2: 7.4000000000000004, 
    3: 17.100000000000001, 
    4: 86.109999999999999}, 
'third': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'}} 

Вместо этого я хочу словарь списков

{0: [10.199999999999999,a], 
1: [5.7000000000000002,b], 
2: [7.4000000000000004,c], 
3: [17.100000000000001,d], 
4: [86.109999999999999,e]} 

Как бороться с этим ?

ответ

2

Возможно, кто-то еще может перезвонить с помощью решения pure-pandas, но я думаю, что это должно сработать для вас. В основном вы создадите словарь «на лету», индексируя значения в каждой строке.

d = {df.loc[idx, 'first']: [df.loc[idx, 'second'], df.loc[idx, 'third']] for idx in range(df.shape[0])} 

d 
Out[5]: 
{0: [10.199999999999999, 'a'], 
1: [5.7000000000000002, 'b'], 
2: [7.4000000000000004, 'c'], 
3: [17.100000000000001, 'd'], 
4: [86.109999999999999, 'e']} 

Edit: Вы также можете сделать это:

df['new'] = list(zip(df['second'], df['third'])) 

df 
Out[25]: 
    first second third fourth   new 
0  0 10.20  a  z (10.2, a) 
1  1 5.70  b  zz (5.7, b) 
2  2 7.40  c zzz (7.4, c) 
3  3 17.10  d zzzz (17.1, d) 
4  4 86.11  e zzzzz (86.11, e) 

df = df[['first', 'new']] 

df 
Out[27]: 
    first   new 
0  0 (10.2, a) 
1  1 (5.7, b) 
2  2 (7.4, c) 
3  3 (17.1, d) 
4  4 (86.11, e) 

df.set_index('first').to_dict() 
Out[28]: 
{'new': {0: (10.199999999999999, 'a'), 
    1: (5.7000000000000002, 'b'), 
    2: (7.4000000000000004, 'c'), 
    3: (17.100000000000001, 'd'), 
    4: (86.109999999999999, 'e')}} 

При таком подходе, вы бы сначала создать список (или кортеж), вы хотите сохранить, а затем «падение» другие столбцы. Это в основном ваш оригинальный подход, модифицированный.

И если вы действительно хотите списки вместо кортежей, просто map в list типа на этой 'new' колонке:

df['new'] = list(map(list, zip(df['second'], df['third']))) 
+0

Мой настоящий «первый» - это столбец чисел, закодированный как «строки» (буквенно-цифровые значения, честно говоря). Поэтому при портировании в словарь они выглядят как 'u'112233''. Как избавиться от этого 'u' (unicode)? – FaCoffee

+1

Это «u» на самом деле не влияет на «целостность» этих строк, но если вы хотите, чтобы оно исчезло, я бы попробовал «map (str, df ['first'])'. Или даже 'df ['first'] = [str (x) для x в df ['first']]' – blacksite

+0

Это, вероятно, должно быть отдельным вопросом, но что, если вы хотите кортеж '(first, second)' как ключ словаря? – FaCoffee

1

Вы можете создать numpy array по values, zip по столбцам first и конвертировать в dict:

a = dict(zip(df['first'], df[['second','third']].values.tolist())) 
print (a) 
{0: [10.2, 'a'], 1: [5.7, 'b'], 2: [7.4, 'c'], 3: [17.1, 'd'], 4: [86.11, 'e']} 
1

Вы можете zip значения:

In [118]: 
b=df.set_index('first')[['second','third']].values.tolist() 
dict(zip(df['first'].index,b)) 

Out[118]: 
{0: [10.2, 'a'], 1: [5.7, 'b'], 2: [7.4, 'c'], 3: [17.1, 'd'], 4: [86.11, 'e']} 
Смежные вопросы