python - 计算熊猫列内的序列
问题描述
我有以下问题。假设我有这个数据框:
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 循环结合起来,但它对我不起作用。非常感谢您的帮助!
解决方案
看起来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
推荐阅读
- python - 为什么 reset_sequences=True 会导致 pytest 实际上将差异刷新到 test_database?
- arrays - C中的双数组
- c# - ITextSharp Image getInstance 旋转我的图像
- android - 如何测试广播接收器的接收?
- python - 安装 Django 时升级 pip 错误
- fonts - 将@fontface 添加到故事书
- ios - Xamarin Forms IOS导航栏
- django - 如果发布到分支,则更改某些变量的最佳实践
- curl - CURL 如何正确使用 curl_easy_escape()
- javascript - 引导程序 4:数据键盘 =“真”不工作