Я предполагаю, что cols: A, B, C, D, E, F, т.е. если в col A == ', сделать новый col G = col C, новый col H = col D, новый col I = col E, если в col A! = '' & Col B == 'some-value', make col G = 0, col H = 0, col I = 0 .. пробовал использовать np.where, но он поддерживает два условия только для любой идеи.

def change(dfr):

  if (dfr['A']==''): 
    dfr['G'] = dfr['A']
    dfr['H'] = dfr['B']
    dfr['I'] = dfr['C']
  if ((dfr['A']!='') & (dfr['B']=='some-value')): 
    dfr['G'] = dfr['A']
    dfr['H'] = dfr['B']
    dfr['I'] = dfr['C']
  if ((dfr['A']!='') & (dfr['B']=='value')):
    dfr['G'] = 0
    dfr['H'] = 0
    dfr['I'] = 0
0
De.Maria 4 Дек 2019 в 09:54
 – 
Henry Yik
4 Дек 2019 в 09:57
Не в состоянии использовать это
 – 
De.Maria
4 Дек 2019 в 11:39

1 ответ

Я не уверен, что вам нужны операторы if. Вы можете использовать .loc для этого. Вот игрушечный фрейм данных:

data = pd.DataFrame({"A" : ['a', '', 'f', '4', '', 'z'],
                    "B" : ['f', 'y', 't', 'u', 'o', '1'],
                    "C" : ['a', 'b', 'c', 'd', 'e', 'f'],                   
                    "G" : [1, 1, 1, 1, 1, 1],
                    'H' : [6, 6, 6, 6, 6, 6],
                    "I" : ['q', 'q', 'q', 'q', 'q', 'q']})

data

   A  B  C  G  H  I
0  a  f  a  1  6  q
1     y  b  1  6  q
2  f  t  c  1  6  q
3  4  u  d  1  6  q
4     o  e  1  6  q
5  z  1  f  1  6  q

Возможно, имеет смысл встроить пару аргументов для значений, которые вы хотите проверить в столбцах B:

def change(dfr, b_firstvalue, b_secondvalue):  
    new_df = dfr.copy()
    new_df.loc[new_df['A']=='', 'G'] = new_df['A'] 
    new_df.loc[new_df['A']=='', 'H'] = new_df['B']
    new_df.loc[new_df['A']=='', 'I'] = new_df['C']

    new_df.loc[((new_df['A']!='') & (new_df['B'] == b_firstvalue)), 'G'] = new_df['A']
    new_df.loc[((new_df['A']!='') & (new_df['B'] == b_firstvalue)), 'H'] = new_df['B']
    new_df.loc[((new_df['A']!='') & (new_df['B'] == b_firstvalue)), 'I'] = new_df['C']

    new_df.loc[((new_df['A']!='') & (new_df['B'] == b_secondvalue)), 'G'] = 0
    new_df.loc[((new_df['A']!='') & (new_df['B'] == b_secondvalue)), 'H'] = 0
    new_df.loc[((new_df['A']!='') & (new_df['B'] == b_secondvalue)), 'I'] = 0
    return new_df

data2 = change(data, '1', 'f')

data2

   A  B  C  G  H  I
0  a  f  a  0  0  0
1     y  b     y  b
2  f  t  c  1  6  q
3  4  u  d  1  6  q
4     o  e     o  e
5  z  1  f  z  1  f

Очевидно, что функция будет зависеть от того, сколько именно столбцов вы хотите иметь дело. Это было просто решение для примера проблемы. Если у вас есть еще много столбцов, которыми вы хотите заменить значения, могут быть более эффективные способы обработки этого.

0
Joe 4 Дек 2019 в 15:05
Я рада, что смогла помочь! Буду признателен, если вы примете мой ответ, если почувствуете, что это решение вашей проблемы. Если нет, я мог бы попытаться улучшить его, если вам потребуется дальнейшая доработка.
 – 
Joe
5 Дек 2019 в 15:05