В проекте, над которым я работаю, мне нужно рассчитать расстояния между векторами. Дело в том, что изначально у меня только ненулевые значения и адреса этих датчиков (тех, которые не давали нулевых значений амплитуды):

 id        address amplitudes
0   1  [a:1,b:1,c:1]    [2,3,5]
1   2  [a:1,c:1,d:1]    [2,4,4]
2   3  [b:1,d:1,f:1]    [3,4,6]

Теперь список всех датчиков: ORIG = ['a:1','b:1','c:1','d:1','e:1','f:1']

На самом деле я хочу получить следующий фрейм данных:

   id              address     amplitudes
0   1  [a:1,b:1,c:1,0,0,0]  [2,3,5,0,0,0]
1   2  [a:1,0,c:1,d:1,0,0]  [2,0,4,4,0,0]
2   3  [0,b:1,0,d:1,0,f:1]  [0,3,0,4,0,6]

Изначально я думал о применении функции такого типа:

def missing_letter_basic(s):
    for letter in string.ascii_lowercase:
        if letter not in s: return letter
    raise Exception("No missing letter")

Для определения недостающих адресов:

DF1['miss'] = DF1['address'].apply(missing_letter_basic)

  id        address amplitudes miss
0   1  [a:1,b:1,c:1]    [2,3,5]    d
1   2  [a:1,c:1,d:1]    [2,4,4]    b
2   3  [b:1,d:1,f:1]    [3,4,6]    a

Но, как видите, ничего разумного он не делает. Во-первых, он не перечисляет все пропущенные буквы, и я не знаю, как двигаться дальше.

Любые идеи?

2
Serge de Gosson de Varennes 22 Ноя 2021 в 13:52

1 ответ

Лучший ответ

Идея состоит в том, чтобы создать список словарей, поэтому можно создать DataFrame и добавить недостающие значения с помощью DataFrame.fillna и DataFrame.reindex:

#if necessary
#df['address'] = df['address'].str.strip('[]').str.split(',')
#df['amplitudes'] = df['amplitudes'].str.strip('[]').str.split(',')

ORIG = ['a:1','b:1','c:1','d:1','e:1','f:1']

d = [dict(zip(a, b)) for a, b in zip(df['address'], df['amplitudes'])]
df1 = pd.DataFrame(d).fillna(0).astype(int).reindex(ORIG, axis=1, fill_value=0)

d2 = [dict(zip(a, a)) for a in df['address']]
df2 = pd.DataFrame(d2).fillna(0).reindex(ORIG, axis=1, fill_value=0)

df['address'] = df2.to_numpy().tolist()
df['amplitudes'] = df1.to_numpy().tolist()
print (df)
   id                   address          amplitudes
0   1  [a:1, b:1, c:1, 0, 0, 0]  [2, 3, 5, 0, 0, 0]
1   2  [a:1, 0, c:1, d:1, 0, 0]  [2, 0, 4, 4, 0, 0]
2   3  [0, b:1, 0, d:1, 0, f:1]  [0, 3, 0, 4, 0, 6]
1
jezrael 22 Ноя 2021 в 14:11
1
Чудесно! Спасибо, @jezrael!
 – 
Serge de Gosson de Varennes
22 Ноя 2021 в 14:10