Создать столбец панд из соответствующих слов в других столбцах - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть фрейм данных с несколькими столбцами вещества, например:

import random

values = ['oil', 'gas', 'water']
modifier = ['dirty', 'crude', 'fuel']
wordzip = [modifier, values]

data = [[wordzip[0][random.randint(0,2)] + ' ' + wordzip[1][random.randint(0,2)] for c in wordzip[0]] for i in range(7)]

pd.DataFrame(data = data, columns = ['A', 'B', 'C'])

             A            B            C   
0    dirty gas    crude oil  dirty water 
1  dirty water     fuel gas    dirty gas  
2  dirty water     fuel gas    dirty oil  
3     fuel oil  crude water    crude gas  
4  dirty water     fuel oil  dirty water  
5    crude oil   fuel water    dirty oil
6   fuel water    crude gas  crude water 

Я хочу создать новый столбец со значениями в этих столбцах, который содержит слово «нефть».Таким образом, конечный df должен выглядеть следующим образом:

             A            B            C          D
0    dirty gas    crude oil  dirty water  crude oil
1  dirty water     fuel gas    dirty gas  NaN
2  dirty water     fuel gas    dirty oil  dirty oil
3     fuel oil  crude water    crude gas  fuel oil
4  dirty water     fuel oil  dirty water  fuel oil
5    crude oil   fuel water    dirty oil  crude oil
6   fuel water    crude gas  crude water  NaN

Я пробовал df[['A', 'B', 'C']].apply(lambda x: x.str.contains('oil')), но это возвращает логический фрейм данных, а не сами значения.

Ответы [ 4 ]

0 голосов
/ 13 сентября 2018

Давайте использовать stack + extract:

df['D'] = df.stack().str.extract(r'(.* oil)').groupby(level=0).first()[0]
df
             A            B            C          D
0    dirty gas    crude oil  dirty water  crude oil
1  dirty water     fuel gas    dirty gas        NaN
2  dirty water     fuel gas    dirty oil  dirty oil
3     fuel oil  crude water    crude gas   fuel oil
4  dirty water     fuel oil  dirty water   fuel oil
5    crude oil   fuel water    dirty oil  crude oil
6   fuel water    crude gas  crude water        NaN
0 голосов
/ 13 сентября 2018

Примерно так:

import pandas as pd
import random

values = ['oil', 'gas', 'water']
modifier = ['dirty', 'crude', 'fuel']
wordzip = [modifier, values]
data = [[wordzip[0][random.randint(0,2)] + ' ' + wordzip[1][random.randint(0,2)] for c in wordzip[0]] for i in range(7)]
df=pd.DataFrame(data = data, columns = ['A', 'B', 'C'])

temp=df[df[['A', 'B', 'C']].apply(lambda x: x.str.contains('oil'))]
df['D'] = temp.A.combine_first(temp.B).combine_first(temp.C)
0 голосов
/ 13 сентября 2018

Использование applymap с bfill

df[df.applymap(lambda x : 'oil' in x)].bfill(1).loc[:,'A']
Out[80]: 
0          NaN
1          NaN
2     fuel oil
3    crude oil
4    crude oil
5     fuel oil
6          NaN
Name: A, dtype: object
0 голосов
/ 13 сентября 2018

Этот ответ суммирует строки по горизонтали, а затем использует регулярное выражение для получения желаемого результата:

# insert temporary columns containing spaces for this regex implementation to work
df.insert(1,'a',' ')
df.insert(3,'b',' ')

# this regex contains a capture group which will get 'oil' instances and the preceding word
df['D'] = df.sum(axis=1).str.extract('([a-z]+ oil)')

# remove the temporary columns
df.drop(['a', 'b'], axis=1, inplace=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...