Создать столбец в кадре данных Pandas на основе условия - PullRequest
0 голосов
/ 23 октября 2018

У меня есть фрейм данных, я хочу создать третий столбец, скажем, col3, исходя из условия, если значение col2 присутствует в col1, тогда «Да», иначе «Нет»

data = [[[('330420', 0.9322496056556702), ('76546', 0.9322003126144409)],76546],[[('330420', 0.9322496056556702), ('500826', 0.9322003126144409)],876546]]
test = pd.DataFrame(data, columns=['col1','col2'])

                                                col1    col2
0  [(330420, 0.9322496056556702), (76546, 0.93220...   76546
1  [(330420, 0.9322496056556702), (500826, 0.9322...  876546

Желаемый результат:

data = [[[('330420', 0.9322496056556702), ('76546', 0.9322003126

    144409)],76546, 'Yes'],[[('330420', 0.9322496056556702), ('500826', 0.9322003126144409)],876546,'No']]
    test = pd.DataFrame(data, columns=['col1','col2', 'col3'])

                                                    col1    col2 col3
    0  [(330420, 0.9322496056556702), (76546, 0.93220...   76546  Yes
    1  [(330420, 0.9322496056556702), (500826, 0.9322...  876546   No

Мое решение:

test['col3'] = [entry for tag in test['col2'] for entry in test['col1'] if tag in entry]

Ошибка получения: ValueError: Length of values does not match length of index

Ответы [ 4 ]

0 голосов
/ 23 октября 2018

Вы можете сделать это, используя .apply()

def sublist_checker(row):
    check_both = ['Yes' if str(row['col2']) in sublist else 'No' for sublist in row['col1']]
    check_any = 'Yes' if 'Yes' in check_both else 'No'
    return check_any

test['col3'] = test.apply(sublist_checker, axis=1)
print(test)

                                                   col1    col2 col3
0   [(330420, 0.932249605656), (76546, 0.932200312614)]   76546  Yes
1  [(330420, 0.932249605656), (500826, 0.932200312614)]  876546   No

Функция sublist_checker выполняет построчную проверку каждого элемента в test['col2'] для каждого подсписка, найденного в test['col1'], и возвращаетYes или No в зависимости от наличия или отсутствия этого элемента в любом из подсписков.

0 голосов
/ 23 октября 2018

Использование numpy where:

test['col3'] = test.apply(lambda x: np.where(str(x.col2) in [i[0] for i in x.col1],"yes", "no"), axis =1)
test['col3']
0    yes
1     no
0 голосов
/ 23 октября 2018

Вам следует избегать списков в серии.Давайте попробуем векторизованное решение:

# extract array of values and reshape
arr = np.array(df.pop('col1').values.tolist()).reshape(-1, 4)

# join to dataframe and replace list of tuples
df = df.join(pd.DataFrame(arr, dtype=float))

# apply test via isin
df['test'] = df.drop('col2', 1).isin(df['col2']).any(1)

print(df)

     col2         0        1         2       3   test
0   76546  330420.0  0.93225   76546.0  0.9322   True
1  876546  330420.0  0.93225  500826.0  0.9322  False
0 голосов
/ 23 октября 2018

Использование any с zip

[any([int(z[0])==y for z in x]) for x, y in zip (test.col1,test.col2)]
Out[227]: [True, False]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...