Pandas: каждое значение списка ячеек в нижнем регистре - PullRequest
0 голосов
/ 05 мая 2020

У меня есть такой фрейм данных

# initialize list of lists 
data = [[1, ['ABC', 'pqr']], [2, ['abc', 'XY']], [3, np.nan]] 

# Create the pandas DataFrame 
data = pd.DataFrame(data, columns = ['Name', 'Val'])
data

    Name  Val
0   1     [ABC, pqr]
1   2     [abc, XY]
2   3     NaN

Я пытаюсь преобразовать каждое значение в списке в нижний регистр

data['Val'] = data['Val'].apply(lambda x: np.nan if len(x) == 0 else [item.lower() for item in x])
data

Однако я получаю эту ошибку

TypeError: object of type 'float' has no len()

Ожидаемый конечный результат

     Name  Val
0   1     [abc, pqr]
1   2     [abc, xy]
2   3     NaN

1 Ответ

1 голос
/ 05 мая 2020

Первая идея - фильтровать строки без пропущенных значений и обработки:

m = data['Val'].notna()
data.loc[m, 'Val'] = data.loc[m, 'Val'].apply(lambda x: [item.lower() for item in x])
print (data)
   Name         Val
0     1  [abc, pqr]
1     2   [abc, xy]
2     3         NaN

Или вы можете обрабатывать только list s, отфильтрованные по isinstance:

f = lambda x: [item.lower() for item in x] if isinstance(x, list) else np.nan
data['Val'] = data['Val'].apply(f)
print (data)
   Name         Val
0     1  [abc, pqr]
1     2   [abc, xy]
2     3         NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...