Как пройти по циклу данных панд, проверить условия, выполнить манипуляции со строками и записать в новый столбец? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть датафрейм, как показано ниже;

--------------------------------
Col1    Col2                    
--------------------------------
1       AppVer: 1.1.1 | name: A 
0       name:B                  
1       AppVer: 2.3.1 | name: B 

Я хотел создать новый столбец (newCol3) на основе условия 1. Если Col1 = 1, тогда разбейте Col2 на основе "|" и напиши в колонку newCol3 2. Если Col1 = 0, напишите «Не применимо» в столбец newCol3

Я попробовал приведенный ниже код для цикла с использованием iterrows & условных операторов;

for index, row in df1.iterrows():
    if row['Col1']==1:
        df1['newCol3']="NA"
    elif row['Col1']==0:
        a=row['Col2'].split("|")
        df1['newCol3']=a[0]

Но если значение в newCol3 не соответствует ожидаемому, как показано ниже. Кроме того, я получаю предупреждение, как это " main : 8: SettingWithCopyWarning: Значение пытается быть установлено для копии среза из DataFrame. Попробуйте вместо этого использовать .loc [row_indexer, col_indexer] = значение Смотрите предупреждения в документации: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy"

Полученный результат:

---------------------------------------------------
Col1    Col2                        newCol3
---------------------------------------------------
1       AppVer: 1.1.1 | name: A     1.1.1
0       name:B                      1.1.1
1       AppVer: 2.3.1 | name: B     2.3.1

Ожидаемый результат:

---------------------------------------------------
Col1    Col2                        newCol3
---------------------------------------------------
1       AppVer: 1.1.1 | name: A     1.1.1
0       name:B                      Not Applicable
1       AppVer: 2.3.1 | name: B     2.3.1

Предоставьте мне любую помощь / предложения.

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Я чувствую, что вы можете сделать

df['New']=df.Col2.str.extract('(\d*\.?\d+\.?\d+)').fillna('Not Applicable')
df
Out[43]: 
   Col1                      Col2             New
0     1  AppVer: 1.1.1 | name: A            1.1.1
1     0  name:B                    Not Applicable
2     1  AppVer: 2.3.1 | name: B            2.3.1
0 голосов
/ 14 мая 2019

В вашем случае я бы предложил использовать loc для создания нового столбца.

Документы: loc

Документы: str expand

Документы для извлечения str: str.extract

df.loc[df['Col1']==1,'Col3'] = df['Col2'].str.extract(pat='insert the pattern here')
df.loc[df['Col1']==0,'Col3'] = 'Not Applicable'

Только что увидел ожидаемый результат.Прочитайте документы, которые я связал, и при необходимости измените str.extract.

...