按字母升序填充数据帧列,直到另一列为True/更改,然后重新开始



我的目标是填补"链接";列按字母顺序升序排列,直到";节点";改变(或"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

相关内容

最新更新