Присваивать двоичное значение, содержит ли столбец пустой список

#python #pandas

#python #pandas

Вопрос:

Я хотел бы присвоить двоичное значение (1 или 0) независимо от того, содержит ли столбец не пустые / пустые списки.

Например:

 Country       Test
Germany        []
Italy         ['pizza']
United Kingdom ['queen', 'king','big']
France        ['Eiffel']
Spain         []

...
  

Чего я ожидал бы, так это чего-то подобного:

 Country       Test            Binary
Germany        []               0
Italy         ['pizza']         1
United Kingdom ['queen', 'king','big']    1
France        ['Eiffel']        1
Spain         []                0

...
  

Я не знаю, как использовать np.where или другой, чтобы получить эти результаты.
Я думаю, чтобы проверить, содержит ли столбец пустой список, я должен сделать что-то вроде этого: df[df['Test'] != '[]']

Комментарии:

1. df['Binary'] = (df['Test'] != []).astype(int)

2. получение этой ошибки: ValueError: длины должны совпадать для сравнения

3. попробуйте df['Binary'] = (df['Test'].neq([])).astype(int) тогда

4. Наконец, рабочее решение: df['Test'].astype(bool).astype(int)

5. df['Binary'] = (df['Test'].str.len() != 0).astype(int) сработало для меня.

Ответ №1:

Вы можете выполнить простую проверку длины и на основе значения преобразовать его в 0 или 1.

 df['Binary'] = (df['Test'].str.len() != 0).astype(int)
  

Хотя это хорошо, наиболее эффективный способ сделать это был предоставлен @Marat.

 df['Binary'] = df['Test'].astype(bool).astype(int)
  

Полный код здесь:

 import pandas as pd
c = ['Country','Test']
d = [['Germany',[]],
['Italy',['pizza']],
['United Kingdom', ['queen', 'king','big']],
['France',['Eiffel']],
['Spain',[]]]

df = pd.DataFrame(data=d,columns=c)
df['Binary'] = df['Test'].astype(bool).astype(int)
print (df)
  

Результатом этого будет:

           Country                Test  Binary
0         Germany                  []       0
1           Italy             [pizza]       1
2  United Kingdom  [queen, king, big]       1
3          France            [Eiffel]       1
4           Spain                  []       0
  

Ответ №2:

Использовать str.len :

 np.clip(df.Test.str.len(), 0, 1)
#or
(df.Test.str.len()==0).astype(int)