【问题标题】:pandas dataframe to frozenset based on conditions熊猫数据框根据条件冻结集
【发布时间】:2018-11-05 22:38:12
【问题描述】:

我有一个像这样的数据集:

 node    community
  1         2
  2         4
  3         5
  4         2
  5         3
  7         1
  8         3
  10        4
  12        5

我希望以他们的社区相同的方式拥有节点列的冻结集。因此,预期的结果是这样的:

 [frozenset([1,4]), frozenset([2,10]), frozenset([3,12]),frozenset([5,8]),frozenset([1])]

有什么方法可以在不将数据框更改为列表的情况下做到这一点。 谢谢。

【问题讨论】:

  • 最后一个frozenset 应该是7 而不是1

标签: python pandas list dataframe frozenset


【解决方案1】:

使用GroupBy + applyfrozenset

res = df.groupby('community')['node'].apply(frozenset).values.tolist()

print(res)

[frozenset({7}), frozenset({1, 4}), frozenset({8, 5}),
 frozenset({2, 10}), frozenset({3, 12})]

【讨论】:

  • 我正要回答同样的问题!但我认为你可以省略 .values 而只使用 tolist()
  • @sacul,好点,谢谢。我知道这是可能的,但出于我从未理解过的原因,pd.Series.tolist 并不比np.ndarray.tolist 慢。
【解决方案2】:

我建议迭代您的 GroupBy 对象并改为发出地图。

communities = {k: frozenset(g['node']) for k, g in df.groupby('community')}
print(communities)
{1: frozenset({7}),
 2: frozenset({1, 4}),
 3: frozenset({5, 8}),
 4: frozenset({2, 10}),
 5: frozenset({3, 12})}

或者,如果你想要一个列表(你会丢失关于键的信息),那么

communities = [frozenset(g['node']) for _, g in df.groupby('community')]

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 2015-04-30
    • 1970-01-01
    • 2023-02-21
    • 2022-01-25
    • 2023-03-21
    相关资源
    最近更新 更多