DataFrame中的字典:来自一列的键,来自多行和列的值,不包括NaN

时间:2017-11-21 07:32:32

标签: python python-2.7 pandas dictionary

我想从pd.DataFrame创建字典,我希望id成为关键字,所有value_x都是值,但不包括NaN

数据框newdf

     id    name  value_1  value_2  value_3
0    ant   jay   10.2     3.5      4.7
1    ant   ann   5.7      10.2     NaN
2    bee   will  7.4      NaN      NaN
3    bee   dave  12.4     1.3      6.9
4    bee   ed    0.8      NaN      NaN
5    cat   kit   NaN      NaN      5.2

预期结果(值逐行排序)是

{ant:(10.2,3.5,4.7,5.7,10.2), bee:(7.4,12.4,1.3,6.9,0.8), cat:(5.2)}

我正在尝试使用.to_dict(),但它确实可以使用

newdf.groupby('id').apply(newdf.iloc[:,-3:].to_dict())

dict(zip(newdf.id, newdf.iloc[:,-3:]))

2 个答案:

答案 0 :(得分:2)

使用:

d = df.set_index('id').iloc[:, -3:].stack().groupby(level=0).apply(tuple).to_dict()
print (d)
{'bee': (7.4, 12.4, 1.3, 6.9, 0.8), 'cat': (5.2,), 'ant': (10.2, 3.5, 4.7, 5.7, 10.2)}

详情:

print (df.set_index('id').iloc[:, -3:].stack())

id          
ant  value_1    10.2
     value_2     3.5
     value_3     4.7
     value_1     5.7
     value_2    10.2
bee  value_1     7.4
     value_1    12.4
     value_2     1.3
     value_3     6.9
     value_1     0.8
cat  value_3     5.2
dtype: float64

如果必须进行排序,则可以使用pandas 0.21.0生成OrderedDict

from collections import OrderedDict

d = (df.set_index('id')
       .iloc[:, -3:]
       .stack()
       .groupby(level=0)
       .apply(tuple)
       .to_dict(into=OrderedDict))
print (d)

OrderedDict([('ant', (10.2, 3.5, 4.7, 5.7, 10.2)), 
             ('bee', (7.4, 12.4, 1.3, 6.9, 0.8)), 
             ('cat', (5.2,))])

答案 1 :(得分:0)

您可以通过定义自定义函数来绕过stack调用,以处理NaN空间中的numpy

def f(x):
     v = x.values.ravel()
     return tuple(v[~np.isnan(v)].tolist())

df.drop('name', 1).set_index('id').groupby(level=0).apply(f).to_dict()

{'ant': (10.2, 3.5, 4.7, 5.7, 10.2),
 'bee': (7.4, 12.4, 1.3, 6.9, 0.8),
 'cat': (5.2,)}