将pandas数据框转换为字典

时间:2015-07-29 07:14:45

标签: python python-2.7 numpy pandas dataframe

我有pandas.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),

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

这应该让你顺利。假设您有一个数据框

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列表而不是单个dict)。

接下来是有趣的部分。您希望仔细过滤掉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')]