Если столбец не содержит значения из другого столбца в той же строке, то добавьте значение из другого столбца в новой строке панды - PullRequest
0 голосов
/ 12 декабря 2018

Я хочу добавить значения из столбца «A» в столбец «B» в новой строке, только если соответствующее значение из столбца «A» не содержится в столбце «B».

Мои данныеframe:

df

  A          B
  value1     value4
  value1     
  value1     value4\nvalue1\n
  value2     value4\nvalue7\n
  value2     value4\n
  value3     
  value3     value4\nvalue3\nvalue6
  value3     value2\nvalue1
  value3     value3\nvalue1\nvalue6

Итак, мой желаемый фрейм данных

df

  A          B
  value1     value4\nvalue1
  value1     value1
  value1     value4\nvalue1
  value2     value4\nvalue7\nvalue2
  value2     value4\nvalue2
  value3     value3
  value3     value4\nvalue3\nvalue6
  value3     value2\nvalue1\nvalue3
  value3     value3\nvalue1\nvalue6

Кроме того, проблема в том, что иногда в концестроки в столбце "B" \ n присутствует, а иногда нет.

Я пытался с df.A.str.contains (df ["A"]), но он не работает, когда содержит() имеет столбец фрейма данных.Я думаю, что что-то вроде этого может работать: df.B.str.extract ('(% s)'% '|' .join (df.A)), и это только для значений из столбца "A", которыеприсутствует в столбце "B" - для матчей, и я не знаю, как приспособиться к моей проблеме.

Буду признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Я предлагаю вам использовать df.apply для этой цели.Внутри вы сможете использовать lambda для создания вашего состояния.Также я использую strip() для удаления \n из начала и конца.См. Код ниже:

# Code to build the dataframe
import pandas as pd
d = {'A': ['value1', 'value1', 'value1', 'value2', 'value2', 'value3', 'value3', 'value3', 'value3'], 'B': ['value4', '', 'value4\nvalue1\n', 'value4\nvalue7\n', 'value4\n', '', 'value4\nvalue3\nvalue6', 'value2\nvalue1', 'value3\nvalue1\nvalue6']}
df = pd.DataFrame(data=d)

# Here is the code to use
print(df.apply(lambda x: [x["A"], (x["B"].strip()+"\n"+x["A"]).strip()] if x["A"] not in x["B"] else [x["A"], x["B"].strip()], axis=1, result_type='broadcast'))

Вывод:

        A                         B
0  value1            value4\nvalue1
1  value1                    value1
2  value1            value4\nvalue1
3  value2    value4\nvalue7\nvalue2
4  value2            value4\nvalue2
5  value3                    value3
6  value3    value4\nvalue3\nvalue6
7  value3    value2\nvalue1\nvalue3
8  value3    value3\nvalue1\nvalue6
8  value3    value3\nvalue1\nvalue6
0 голосов
/ 12 декабря 2018

Создание логической маски с пониманием списка с заменой отсутствующих значений на пустую строку и использование Series.where:

mask = [a in b for a, b in zip(df['A'], df['B'].fillna(''))]
b = df['B'].str.replace(r'\\n$', '')
df['B'] = b.where(mask, b + '\\n' + df['A']).fillna(df['A'])
print (df)
        A                       B
0  value1          value4\nvalue1
1  value1                  value1
2  value1          value4\nvalue1
3  value2  value4\nvalue7\nvalue2
4  value2          value4\nvalue2
5  value3                  value3
6  value3  value4\nvalue3\nvalue6
7  value3  value2\nvalue1\nvalue3
8  value3  value3\nvalue1\nvalue6
...