Ассоциация столбцов элементов в кадре данных - PullRequest
0 голосов
/ 01 декабря 2019

У меня есть следующий фрейм данных, и я хотел бы написать лямбда-функцию, способную распознавать, что если элемент в col1 входит в одну из групп в col2, поэтому он принимает значение col3, связанное с этой группой, как в приведенном ниже результате дляcol1 = (5,6) со значением col3 = (0.3,0.2)

col1 col2 col3
1 .  1    0.7
2 .  2 .  0.9
3 .  3,5 .0.3
4 .  4,6 .0.2  
5 .  NaN .NaN
6 .  NaN .NaN

Результат

col1 col2 col3
1 .  1    0.7
2 .  2 .  0.9
3 .  3,5 .0.3
4 .  4,6 .0.2  
5 .  NaN .0.3
6 .  NaN .0.2

Я написал лямбда-функцию

f = lambda x: next(iter([y for y in df['col2'].dropna().tolist() if str(x) in y]), df['col3])
df['col1'].apply(f)

Но я не совсем уверен, что так

1 Ответ

1 голос
/ 01 декабря 2019

Предполагая, что значения col2 являются списком, например:

   col1    col2  col3
0     1     [1]   0.1
1     2  [2, 4]   0.2
2     3  [3, 5]   0.3
3     4  [4, 6]   0.2
4     5     NaN   NaN
5     6     NaN   NaN

Вы можете сделать следующее:

# create lookup dictionary to replace for nan
pairs = df[['col2', 'col3']].explode('col2').dropna()
lookup = {int(key): value for key, value in pairs.itertuples(index=False, name=None)}

# replace the value only where isna
df['col3'] = np.where(df.col3.isna(), df.col1.map(lookup.get), df.col3)

print(df)

Вывод

   col1    col2  col3
0     1     [1]   0.1
1     2  [2, 4]   0.2
2     3  [3, 5]   0.3
3     4  [4, 6]   0.2
4     5     NaN   0.3
5     6     NaN   0.2

Обратите внимание, что вы должны импортировать numpy, чтобы это решение работало. Если col2 является строкой, вы можете попробовать:

df['col2'] = df.col2.str.split(",")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...