может быть, не так коротко, но я думаю, что с некоторыми регулярными выражениями и манипуляциями со списком это возможно.сначала я извлекаю числа из строки для каждого человека
df1.replace(to_replace=['\(\d+ \)','\( \d+ \)','Done','done'],value='', regex=True, inplace=True)
df1.replace(to_replace=['to'],value='-', regex=True, inplace=True)
df1.replace(to_replace=['and'],value=',', regex=True, inplace=True)
df1.person_a = df1.person_a.str.split(',')
df1.person_b = df1.person_b.str.split(',')
df1
person_a person_b
0 [ 37918 , 37925 -37932 , 37934 - 37939 ] [ 37940 - 37950 , 38101 - 38109 ]
второй шаг - создание df для каждого человека с диапазонами
person_a = pd.DataFrame(df1['person_a'].values.tolist()).T.rename(columns={0:'person_a'})
person_a = person_a.person_a.str.split('-', expand=True) \
.rename(columns={0:'start', 1:'end'}) \
.convert_objects(convert_numeric=True) \
.fillna(0)
person_b = pd.DataFrame(df1['person_b'].values.tolist()).T.rename(columns={0:'person_b'})
person_b = person_b.person_b.str.split('-', expand=True) \
.rename(columns={0:'start', 1:'end'}) \
.convert_objects(convert_numeric=True) \
.fillna(0)
person_a
start end
0 37918 0.0
1 37925 37932.0
2 37934 37939.0
person_b
start end
0 37940 37950
1 38101 38109
Последний шаг - определить функциюсоздать список номеров для каждого человека
def ranges(df):
x = []
for i in range(df.shape[0]):
if df.end[i] == 0:
x.append(list(range(int(df.start[i]), int(df.start[i])+1)))
else:
x.append(list(range(int(df.start[i]), int(df.end[i])+1)))
x = [val for sublist in x for val in sublist]
return x
df = pd.DataFrame({'person_a':pd.Series(ranges(person_a)),'person_b':pd.Series(ranges(person_b))}).fillna(0)
df
person_a person_b
0 37918.0 37940
1 37925.0 37941
2 37926.0 37942
3 37927.0 37943
4 37928.0 37944
5 37929.0 37945
6 37930.0 37946
7 37931.0 37947
8 37932.0 37948
9 37934.0 37949
10 37935.0 37950
11 37936.0 38101
12 37937.0 38102
13 37938.0 38103
14 37939.0 38104
15 0.0 38105
16 0.0 38106
17 0.0 38107
18 0.0 38108
19 0.0 38109