我有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),
非常感谢任何帮助。
答案 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')]