我的目标是填补"链接";列按字母顺序升序排列,直到";节点";改变(或"NewNode"=True(
这是我试过的。
import pandas as pd
import numpy as np
import string
data = {'Node': ['Node_1', 'Node_1','Node_1','Node_1','Node_2','Node_2','Node_2']}
df = pd.DataFrame(data=data)
l=list(string.ascii_uppercase)
def link_def(x):
a = 0
if x == 'True':
l[0]
else:
a = a+1
l[a]
return l[a]
df['NewNode'] = np.where(df['Node'].shift() != df['Node'],True,"")
df['Links'] = df['NewNode'].apply(lambda row : link_def(row))
这是输出
Node NewNode Links
0 Node_1 True A
1 Node_1 B
2 Node_1 B
3 Node_1 B
4 Node_2 True A
5 Node_2 B
6 Node_2 B
所需输出为
Node NewNode Links
0 Node_1 True A
1 Node_1 B
2 Node_1 C
3 Node_1 D
4 Node_2 True A
5 Node_2 B
6 Node_2 C
如何获得所需的输出?
您可以使用矢量代码,使用groupby.cumcount
和映射:来实现这一点
df['NewNode'] = df['Node'].ne(df['Node'].shift())
df['Links'] = (df.groupby(df['NewNode'].cumsum())
.cumcount()
.map(dict(enumerate(string.ascii_uppercase)))
)
如果你不需要中间体";NewNode";列:
df['Links'] = (df.groupby(df['Node']
.ne(df['Node'].shift())
.cumsum())
.cumcount()
.map(dict(enumerate(string.ascii_uppercase)))
)
注意。这仅限于26个替换
输出:
Node NewNode Links
0 Node_1 True A
1 Node_1 False B
2 Node_1 False C
3 Node_1 False D
4 Node_2 True A
5 Node_2 False B
6 Node_2 False C