Как заменить элементы внутри списка последовательно - PullRequest
0 голосов
/ 08 июня 2018

У меня есть DataFrame, как показано ниже,

df1

         col1
0          10
1  [5, 8, 11]
2          15
3          12
4          13
5          33
6    [12, 19]

Код для генерации этого df1:

df1 = pd.DataFrame({"col1":[10,[5,8,11],15,12,13,33,[12,19]]})

df2

   col1  col2
0    12     1
1    10     2
2     5     3
3    11    10
4     7     5
5    13     4
6     8     7

Код для генерации df2:

df2 = pd.DataFrame({"col1":[12,10,5,11,7,13,8],"col2":[1,2,3,10,5,4,7]})

Я хочу заменить элементы в df1 значениями df2.

Если значения ряда содержат не элементы списка, я мог бы просто заменить на map

df1['res'] = df1['col1'].map(df2.set_index('col1')["col2"].to_dict())

Но теперь этот ряд содержит смешанные списки и скаляры.Как эффективно заменить элементы в списке и скалярных значениях последовательно.

Ожидаемый результат

         col1     res
0          10        2
1  [5, 8, 11] [3,7,10]
2          15       15
3          12        1
4          13        4
5          33       33

1 Ответ

0 голосов
/ 08 июня 2018

Ваша серия имеет тип dtype object, так как содержит int и list объекты.Это неэффективно для Pandas и означает, что векторизованное решение будет невозможно.

Вы можете создать словарь сопоставления и использовать pd.Series.apply.Для учета list объектов вы можете поймать TypeError.Вы встречаете эту конкретную ошибку для списков, поскольку они не могут быть хешируемыми и поэтому не могут использоваться в качестве ключей словаря.

d = df2.set_index('col1')['col2'].to_dict()

def mapvals(x):
    try:
        return d.get(x, x)
    except TypeError:
        return [d.get(i, i) for i in x]

df1['res'] = df1['col1'].apply(mapvals)

print(df1)

         col1         res
0          10           2
1  [5, 8, 11]  [3, 7, 10]
2          15          15
3          12           1
4          13           4
5          33          33
6    [12, 19]     [1, 19]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...