首页 > 解决方案 > 计算熊猫列内的序列

问题描述

我有以下问题。假设我有这个数据框:

import pandas as pd

d = {'Name': ['c', 'c', 'c', 'a', 'a', 'b', 'b', 'd', 'd'], 'Project': ['aa','ab','bc', 'aa', 'ab','aa', 'ab','ca', 'cb'], 
     'col2': [3, 4, 0, 6, 45, 6, -3, 8, -3]}

df = pd.DataFrame(data=d)

我需要添加一个新列,为每个名称的每个项目添加一个数字。期望的输出是:

import pandas as pd

dnew = {'Name': ['c', 'c', 'c', 'a', 'a', 'b', 'b', 'd', 'd'], 'Project': ['aa','ab','bc', 'aa', 'ab','aa', 'ab','ca', 'cb'], 
     'col2': [3, 4, 0, 6, 45, 6, -3, 8, -3], 'New_column': ['1', '1','1','2', '2','2','2','3','3']}

NEWdf = pd.DataFrame(data=dnew)

换句话说: Project 中的 'aa','ab','bc' 出现在第一行,所以我将 1 添加到新列中。'aa', 'ab' 是从头开始的第二个项目。它发生在名称“a”和“b”上,所以我在两个新列中都添加了 2。'ca', 'cb' 是第三个项目,它只出现在名称 'd' 中,所以我只将 3 添加到名称 'd' 中。

我试图将 groupby 与 for 循环结合起来,但它对我不起作用。非常感谢您的帮助!

标签: pythonpandasdataframe

解决方案


看起来networkx因为NameProject是相关的,你可以使用:

import networkx as nx
G=nx.from_pandas_edgelist(df, 'Name', 'Project')
l = list(nx.connected_components(G))
s = pd.Series(map(list,l)).explode()
df['new'] = df['Project'].map({v:k for k,v in s.items()}).add(1)

print(df)

  Name Project  col2  new
0    a      aa     3    1
1    a      ab     4    1
2    b      bb     6    2
3    b      bc     6    2
4    c      aa     6    1
5    c      ab     6    1

推荐阅读