Лямбда над строками данных, взаимодействующими со столбцами - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь применить это к моему фрейму данных: Для каждой строки:

  • , если строка ['colA'] == 'NONE', то строка ['colA'] = строка ['colX']
  • elif row [' colA ']! =' NONE '& row [' colB '] ==' NONE 'затем row [' colB '] = row [' colX ']

и так далее.Я пытаюсь сделать это с помощью лямбда-функции, чтобы:

dataframe.apply(lambda row: row['colA']=row['result'] if row['colA']=='NONE' else (row['colB']=row['result'] if row['colA']!='NONE' & row['colB']!='NONE'),axis=0)

Но, конечно, не работает.Есть ли способ сделать что-то подобное?Если нет, то я могу решить, применяя итеративную логику, переходя от столбца к столбцу, но мне было интересно, есть ли более быстрый способ сделать это.

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Если NONE - это string s, то сравните для логических масок, ~ - для инвертированной маски и установите значения на loc:

df = pd.DataFrame({'colA':['NONE', 'A', 'NONE', 'D'],
                   'colB':['NONE', 'B', 'C', 'NONE'],
                   'colX':['a','b','c','d']})
print (df)
   colA  colB colX
0  NONE  NONE    a
1     A     B    b
2  NONE     C    c
3     D  NONE    d

m1 = df['colA']=='NONE'
m2 = ~m1 & (df['colB']=='NONE')

df.loc[m1, 'colA'] = df.loc[m1, 'colX']
df.loc[m2, 'colB'] = df.loc[m2, 'colX'] 
print (df)
  colA  colB colX
0    a  NONE    a
1    A     B    b
2    c     C    c
3    D     d    d

И если NONE - это None или NaN (пропущенное значение) изменить логические маски:

df = pd.DataFrame({'colA':[None, 'A',None, 'D'],
                   'colB':[None, 'B', 'C', None],
                   'colX':['a','b','c','d']})
print (df)
   colA  colB colX
0  None  None    a
1     A     B    b
2  None     C    c
3     D  None    d

m1 = df['colA'].isnull()
m2 = ~m1 & df['colB'].isnull()

df.loc[m1, 'colA'] = df.loc[m1, 'colX']
df.loc[m2, 'colB'] = df.loc[m2, 'colX'] 
print (df)
  colA  colB colX
0    a  None    a
1    A     B    b
2    c     C    c
3    D     d    d
0 голосов
/ 24 февраля 2019

Может быть что-то вроде ( лучше всегда публиковать некоторые образцы данных для проверки ):

df=df.replace('NONE',np.nan)
df['colA']=df['colA'].fillna(df['colX'])
df['colB']=np.where(df['colA'].notnull()&df['colB'].isnull(),df['colB'].fillna(df['colX']),df['colB'])
#alternative for above line->
#df.loc[df.colA.notnull()&df.colB.isnull(),'colB']=df.loc[df.colA.notnull()&df.colB.isnull(),'colB'].fillna(df['colX'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...