Python pandas - новый столбец, основанный на других столбцах (String) - PullRequest
0 голосов
/ 19 сентября 2019

Я не смог найти его в stackoverflow, поэтому я хотел задать вопрос.

Давайте предположим, что у меня есть два столбца: A, B в фрейме данных, который состоит из нескольких слов,и я хочу создать новый столбец C, который будет TRUE / FALSE, основываясь на следующем правиле:

 If word in B = word in A + 'ing', then it's True or vice versa
 If word in B = word in A + 'ment', then it's True of vice versa. 

, поэтому я определил следующую функцию:

def parts_of_speech(s1, s2):
    return s1+'ing'==s2 or s1+'ment'==s2 or s1+s1[-1]+'ing'==s2

Например,

  A              B            C
Engage         Engagement   True
Go             Going        True
Axe            Axis         False
Management     Manage       True

Я попробовал следующее:

df['C']=df.apply(lambda x: parts_of_speech(x.A, x.B) or 
                           parts_of_speech(x.B, x.A) )

или

df['C']=df.apply(parts_of_speech(df['A'], df['B']) or 
                           parts_of_speech(df['A'], df['B']) )

Я получаю ту же ошибку:

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

Не знаюзнаю, что я сделал неправильно.Легко ли это исправить?

любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

.apply работает со столбцами по умолчанию.Единственное изменение, необходимое в вашем примере, это добавить axis=1 для применения к строкам:

df['C']=df.apply(lambda x: parts_of_speech(x.A, x.B) or parts_of_speech(x.B, x.A),
                 axis=1)
1 голос
/ 19 сентября 2019

Для ваших образцов данных:

# make B the longer words
df[['A','B']] = np.sort(df[['A','B']])

# split by suffixes
df['B'].str.extract('(\w+)(ment|ing)$',expand=True)[0].eq(df['A'])

Или используйте ваш подход, но векторизованный:

# make B the longer words
df[['A','B']] = np.sort(df[['A','B']])

df['A-ing'] = df['A'] + 'ing'
df['A-ment'] = df['A'] + 'ment'

df.iloc[:,-2].eq(df['A']).all(1)

Вывод:

0     True
1     True
2    False
3     True
dtype: bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...