2015-07-29 3 views
-2

У меня есть pandas.DataFrame вроде этого:откидывание панды dataframe в словарь

df 
#  col3 2000 5000 7500 10000 12000 15000 20000 30000 
#col1 col2        
# 22 0 NaN NaN NaN NaN NaN NaN  1 NaN 
#  1 NaN NaN NaN NaN NaN NaN  1 NaN 
# 24 0  1 NaN NaN NaN NaN  1 NaN NaN 
#  1  1 NaN NaN NaN NaN NaN  1 NaN 
# 26 0 NaN NaN NaN NaN NaN  1 NaN NaN 
#  1 NaN NaN NaN NaN NaN  1 NaN NaN 
# 29 0  1 NaN NaN NaN NaN NaN NaN NaN 
# 31 1 NaN NaN NaN NaN NaN NaN NaN NaN 

и мне нужно сначала отобразить каждую запись следующим образом (псевдо-код) if df.ix[row,col] == 1: df.ix[row,col] = col.

Затем я хочу сохранить сопоставленные записи в списке, игнорируя значения NaN, например. что-то вроде

[ ('col2_0' , 20000), ('col2_1' , 20000), 
    ('col2_0' , 2000), ('col2_1', 2000), 
    ('col2_0' , 15000), ('cols_1' , 20000), 
    ('col2_0' , 15000), ('col2_1' , 15000), 
    ('col2_0' , 2000), ('col2_1' , 2000), 

Любая помощь очень ценится.

+0

Добро пожаловать в переполнение стека. Вы можете взять [тур] и посетить [помощь], потому что в вашем вопросе не хватает нескольких атрибутов качества, которые мы ожидаем от сообщений. В ссылках вы найдете руководство, которое поможет вам улучшить свой вопрос, предоставив ему [edit]. – rene

+0

Я отредактировал сообщение, чтобы сделать его несколько более понятным. Вы можете принять его, чтобы получить некоторую помощь. Самое главное, вы должны знать, что dict не может быть таким, как вы описали выше (с дублирующими ключами). – dermen

ответ

0

Это должно помочь вам. Предположим, у вас есть dataframe

d 
#   2000 3000 
#col1 col2    
#0 0  1  1 
#1 0  1  1 
#  1  1 NaN 
#2 0  1  1 
#  1  1 NaN 
#3 0  NaN  1 
#  1  1 NaN 

Далее вы хотите сбросить индекс

d_flat = d.reset_index() 
# col1 col2 2000 3000 
#0  0  0  1  1 
#1  1  0  1  1 
#2  1  1  1 NaN 
#3  2  0  1  1 
#4  2  1  1 NaN 
#5  3  0 NaN  1 
#6  3  1  1 NaN 

Теперь вы можете отобразить столбец 2:

d_flat.col2 = d_flat.col2.map(lambda x: 'col2_%d'%x) 

#d_flad.col2 
#0 col2_0 
#1 col2_0 
#2 col2_1 
#3 col2_0 
#4 col2_1 
#5 col2_0 
#6 col2_1 
#Name: col2, dtype: object 

следующий шаг, который вы хотите создать список словарей для каждой строки. Выполните следующие

mycols = ['2000', '3000'] 
d_dict = d_flat[mycols].to_dict(orient='records') 
#[{'2000': 1.0, '3000': 1.0}, 
# {'2000': 1.0, '3000': 1.0}, 
# {'2000': 1.0, '3000': nan}, 
# {'2000': 1.0, '3000': 1.0}, 
# {'2000': 1.0, '3000': nan}, 
# {'2000': nan, '3000': 1.0}, 
# {'2000': 1.0, '3000': nan}] 

В orient='records' опция сохраняет каждый элемент по отдельности, так что вы можете иметь повторяющиеся записи (поэтому существует список dicts, в отличие от одного Словаря).

Далее идет интересная часть. Вы хотите тщательно отфильтровать значения nan, которые вы можете сделать в понимании.

from itertools import izip 

mylist = [(col,key) 
      for col,records in izip(d_flat.col2, d_dict) 
      for key,val in records.iteritems() 
      if not pandas.np.isnan(val)] 
#[('col2_0', '2000'), 
# ('col2_0', '3000'), 
# ('col2_0', '2000'), 
# ('col2_0', '3000'), 
# ('col2_1', '2000'), 
# ('col2_0', '2000'), 
# ('col2_0', '3000'), 
# ('col2_1', '2000'), 
# ('col2_0', '3000'), 
# ('col2_1', '2000')] 
Смежные вопросы