我有以下问题。假设我有这个数据框:
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 循环结合起来,但它对我不起作用。非常感谢您的帮助!
答案 0 :(得分:1)
看起来像 networkx
因为 Name
和 Project
是相关的,你可以使用:
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