Pandas: условно объединить исходные столбцы со строкой

#python #pandas

#python #pandas

Вопрос:

ВХОД>df1

     ColumnA ColumnB
     A1       NaN
     A1A2     NaN
     A3       NaN       

  

Что я пытался сделать, так это условно изменить значение столбца B,
на основе итерации проверки ColumnA, добавление замечаний к столбцу B.
Предыдущее значение столбца B должно быть сохранено после добавления новой строки.

В примере фрейма данных то, что я хочу сделать, было бы

  • Если столбец содержит A1. Если это так, добавьте строку «A1» в столбец B (без очистки всех предыдущих значений.)
  • Если столбец содержит A2. Если это так, добавьте строку «A2» в столбец B (без очистки всех предыдущих значений.)

ВЫВОД>df1

     ColumnA ColumnB
     A1       A1
     A1A2     A1_A2
     A3       NaN       

  

Я пробовал следующие коды, но они плохо работают.
Кто-нибудь может дать мне несколько советов? Спасибо.

 df1['ColumnB'] = np.where(df1['ColumnA'].str.contains('A1'), df1['ColumnB'] "_A1",df1['ColumnB'])
df1['ColumnB'] = np.where(df1['ColumnA'].str.contains('A2'), df1['ColumnB'] "_A2",df1['ColumnB'])
  

Ответ №1:

Один из способов использования pandas.Series.str.findall с join :

 key = ["A1", "A2"]
df["ColumnB"] = df["ColumnA"].str.findall("|".join(key)).str.join("_")
print(df)
  

Вывод:

   ColumnA ColumnB
0      A1      A1
1    A1A2   A1_A2
2      A3        
  

Ответ №2:

Вы не можете добавлять или дописывать строки к np.nan . Это означает, что вам всегда нужно будет проверять, является ли какая-либо позиция в вашем ColumnB по-прежнему np.nan или уже является строкой, чтобы правильно установить ее новое значение. Если все, что вы хотите сделать, это работать с текстом, вы можете инициализировать свои ColumnB пустые строки и добавить выбранные фрагменты строк из ColumnA как:

 import pandas as pd
import numpy as np

I = pd.DataFrame({'ColA': ['A1', 'A1A2', 'A2', 'A3']})
I['ColB'] = ''
I.loc[I.ColA.str.contains('A1'), 'ColB']  = 'A1'
print(I)

I.loc[I.ColA.str.contains('A2'), 'ColB']  = 'A2'
print(I)
  

Результат таков:

    ColA ColB
0    A1   A1
1  A1A2   A1
2    A2     
3    A3     
   ColA  ColB
0    A1    A1
1  A1A2  A1A2
2    A2    A2
3    A3      
  

Примечание: это очень подробная версия в качестве примера.

Комментарии:

1. Решено! Как вы упомянули, проблема возникла из-за добавления строк в np.nan