Назначьте столбец с условными значениями на основе строк, содержащихся в других столбцах - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь назначить столбец на основе строк, которые могут содержаться в других столбцах.Например,

var1 = 67

columns = {'col1': ['string1', 'thang2', 'code3', 'string2'], 
          'col2': [1, 2, np.nan, 3], 'col3': ['I', 'cant', 'think', 'what']}

df = pd.DataFrame(data = columns)

Как тогда сделать четвертый столбец col4, который будет col3 + var1 + col1 большую часть времени, но равен np.nan всякий раз, когда col2 равен nan (в той же строке) и к его значению добавляется -W всякий раз, когда есть 'in' в любой строке в col1 (опять же, в той же строке)?

Я знаю все о assign, ноЯ не знаю, как сделать все эти условные вещи в присваивании, или если есть способ сделать это после создания столбца, я тоже не уверен.

1 Ответ

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

Вы можете попробовать это, используя np.where:

df['col4'] = np.where(df['col2'].notnull(),
                      df['col3'] + str(var1) + np.where(df['col1'].str.contains('in'),
                                                        df['col1'] + '-w',
                                                        df['col1']), 
                      np.nan)

Вывод:

      col1  col2   col3             col4
0  string1   1.0      I     I67string1-w
1   thang2   2.0   cant     cant67thang2
2    code3   NaN  think              NaN
3  string2   3.0   what  what67string2-w

Или, если вы хотите сделать это с assign:

df.assign(col5 = np.where(df['col2'].notnull(),
         df['col3'] + str(var1) + np.where(df['col1'].str.contains('in'),
                                           df['col1'] + '-w',
                                           df['col1']), 
         np.nan))

Вывод:

      col1  col2   col3             col4             col5
0  string1   1.0      I     I67string1-w     I67string1-w
1   thang2   2.0   cant     cant67thang2     cant67thang2
2    code3   NaN  think              NaN              NaN
3  string2   3.0   what  what67string2-w  what67string2-w

Обновление: так как вы упомянули скорость.Я думаю, я бы удалил аксессор .str и использовал бы понимание списка.

df['col4'] = np.where(df['col2'].notnull(),
         df['col3'] + str(var1) + np.where(['in' in i for i in df['col1']], 
                                           df['col1'] + '-w', 
                                           df['col1']), 
         np.nan)
...