问题描述
Out[30]:
LN
0 [C,C,G,I,O,P,R,...
1 [C,...
2 [C,...
3 [C,...
4 [C,...
...
43244 [G,R]
43245 [G,R]
43246 [G,R]
43247 [G,R]
43248 [G,R]
如何将其更改为 0 [C1,C2,C3...C6,P1,P2...]
这样做的原因是networkx不允许具有相同标签的节点,但不幸的是我不能去更改原始数据,我需要在这里做。
解决方法
您可以将 defaultdict
与 itertools.count
结合起来制作一个简单干净的解决方案。您基本上为 dict 中的每个字母制作一个计数器,并将其与原始字母连接起来。这应该会让你开始:
from collections import defaultdict
from itertools import count
counter = defaultdict(lambda: count(1))
l = ['C','C','P','G','P']
[c + str(next(counter[c])) for c in l]
# ['C1','C2','C3','P1','P2','G1','C4','P3']
如果您不介意从零开始的计数,您可以稍微简化一下 defaultdict:
counter = defaultdict(count)
当然,您可以将其应用于列表列表:
from collections import defaultdict
from itertools import count
l = [
['C','P'],['C','P']
]
def addNumbs(l):
counter = defaultdict(lambda: count(1))
return [c + str(next(counter[c])) for c in l]
list(map(addNumbs,l))
#[['C1','P3'],# ['C1','G2','P2']]
您还可以使用带有适当 axis
和 result_type
参数的 apply()
将此函数应用于 Pandas 数据帧:
import pandas as pd
from collections import defaultdict
from itertools import count
def addNumbs(l):
counter = defaultdict(lambda: count(1))
return [c + str(next(counter[c])) for c in l]
df = pd.DataFrame([
['C','P']
])
res = df.apply(addNumbs,axis=1,result_type="expand")
res
将是:
0 1 2 3 4 5 6 7
0 C1 C2 C3 P1 P2 G1 C4 P3
1 C1 C2 G1 C3 G2 G3 C4 P1
,
此解决方案假设所有相同的字母都组合在一起并且是一位数字。
letters = ['C','I','O','R','R']
for i in range(len(letters)):
if i != 0:
current_word = letters[i]
prev_word = letters[i-1]
if current_word[0] == prev_word[0]:
if len(prev_word) == 1:
letters[i] = current_word + '1'
else:
letters[i] = current_word[0] + str(int(prev_word[1]) + 1)
print(letters)
如果同一字母可能连续超过 10 个,则必须更改此设置。