计算熊猫列中的序列

时间:2021-02-04 15:20:25

标签: python pandas dataframe

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

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)

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

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

1 个答案:

答案 0 :(得分:1)

看起来像 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