Вставка новых столбцов и соответствующих значений (при условии) в Pandas DataFrame - PullRequest
2 голосов
/ 20 апреля 2020

У меня есть следующий образец DataFrame и List (извлеченный из df).

import pandas as pd
color_list = ['green','blue','red','yellow','black']

df = pd.DataFrame({'object': ['car','plane','tree','house','phone'],
                   'colors': ['red, blue',
                              'red, yellow, black',
                              'black',
                              'green, blue',
                              'yellow, green, blue']})

Мне удалось создать для l oop, который правильно проверяет наличие определенного цвета (из color_list) в столбец цветов. Затем он создает новый столбец, который оценивает это условие и присваивает значение True или False каждой строке. Код следующий:

idx = df.columns.get_loc('colors') + 1

for i in range(len(color_list)):
    df.insert(loc= idx + i, 
                        column='has ' + color_list[i], 
                        value = (df['colors'].str.contains(color_list[i], case=False, na=False)))

Он выводит следующее:

  object               colors  has green  ...  has red  has yellow  has black
0    car            red, blue      False  ...     True       False      False
1  plane   red, yellow, black      False  ...     True        True       True
2   tree                black      False  ...    False       False       True
3  house          green, blue       True  ...    False       False      False
4  phone  yellow, green, blue       True  ...    False        True      False

Что правильно, вопрос в том, могу ли я передать условие в аргумент значения pd.insert?

Я хочу заменить значения True на «has» + (имя столбца) и False на что-то вроде «not has» + (имя столбца). это можно сделать в том же l oop?

Спасибо,

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Согласно документации , метод pandas .DataFrame.insert не имеет этой функции.

Для этого можно использовать pandas .DataFrame.apply.

for color in color_list:
    col_name = 'has ' + color
    df[col_name] = df['colors'].apply(lambda x: f'has {color}' if color in x else f'doesn\'t have {color}')
1 голос
/ 21 апреля 2020

не уверен, что это то, что вы ищете; это похоже на вытягивание 0 и 1 с использованием функции pandas str dummies :

repl = {0:False,1:True}

#get a dataframe of 0s and 1s
#dependent on the presence/absence of words
true_false = (df
              .colors
              .str
              .get_dummies(', ')
              .add_prefix('has ')
               #replace the 0s and 1s with False/True
              .replace(repl))

#combine data back to original dataframe
pd.concat([df,true_false],axis=1)


  object    colors         has black    has blue    has green   has red has yellow
0   car     red, blue          False    True        False       True    False
1   plane   red, yellow, black  True    False       False       True    True
2   tree    black               True    False       False       False   False
3   house   green, blue         False   True        True        False   False
4   phone   yellow, green, blue False   True        True        False   True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...