数据帧到冻结集

时间:2018-02-13 14:35:16

标签: python pandas dataframe frozenset

我想将数据帧转换为frozensets并将数据帧列保留在冻结集中。

实施例

x=pd.DataFrame(data=dict(sample=["A","B","C"],lane=[1,1,2]))
>>> x
   lane sample
0     1      A
1     1      B
2     2      C

我想要的是:

x2= {frozenset({("sample", "A"), ("lane", 1)}),
    frozenset({("sample", "B"), ("lane", 1)}),
    frozenset({("sample", "C"), ("lane", 2)})}

>>> x2
{frozenset({('sample', 'B'), ('lane', 1)}), frozenset({('sample', 'A'), ('lane', 1)}), frozenset({('lane', 2), ('sample', 'C')})}

我试过x.apply(frozenset,1),但它给了我:

0    (1, A)
1    (1, B)
2    (C, 2)
dtype: object

任何帮助都会有用。 谢谢

1 个答案:

答案 0 :(得分:3)

您可以使用records将数据帧转换为所需的pd.DataFrame.to_dict格式:

x.to_dict('records')

# [{'sample': 'A', 'lane': 1}, 
#  {'sample': 'B', 'lane': 1}, 
#  {'sample': 'C', 'lane': 2}]

由于这会产生一个列表,您可以将frozenset映射到列表,如下所示:

# using abbreviation 'r' instead of 'records'
map(lambda y: frozenset(y.iteritems()), x.to_dict('r'))

# [frozenset([('sample', 'A'), ('lane', 1)]), 
#  frozenset([('sample', 'B'), ('lane', 1)]), 
#  frozenset([('sample', 'C'), ('lane', 2)])]

或者,使用集合理解,如果你的输出应该是一组frozensets:

{frozenset(y.iteritems()) for y in x.to_dict('records')}

# set([frozenset([('sample', 'C'), ('lane', 2)]),  
#      frozenset([('sample', 'B'), ('lane', 1)]), 
#      frozenset([('sample', 'A'), ('lane', 1)])])