Pandas - применить & лямбда с условием и вводом из функции - PullRequest
0 голосов
/ 10 марта 2020

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

Заранее спасибо.

DataFrame [df]
a    b    c   d    e    f
100  10   1   www  qqq  1/1/2020
200  20   2   eee  rrr  2/1/2020
300  30   3   ttt  yyy  3/1/2020
400  40   4   uuu  iii  4/1/2020
500  50   5   ooo  ppp  5/1/2020 

def func(x,y):
   for i, r in df.iterrows():
      df_new = df[df['a'].isin(x)]
      if df['b'] <= y:
         df_new['newcolumn1'] = df['b']
         df_new['newcolumn2'] = df['c']
         df_new['newcolumn3'] = df['d']
         df_new['newcolumn4'] = df['e']
         df_new['newcolumn5'] = df['f']
         df_new['newcolumn6'] = y - df['b']
      else:
         continue 
 return df;

Ответы [ 2 ]

1 голос
/ 10 марта 2020

У вас нет причин использовать здесь явные l oop или apply:

def func(x, y):
    df_new = df[df['a'].isin(x)]
    df2 = df_new.loc[df_new['b'] <= y, df.columns[1:]]
    df2.columns = ['newcolumn' + str(i) for i in range(1,6)]
    df2['newcolumn6'] = y - df_new['b']
    df2 = df2.astype('object')    # avoid conversion of int to float with NaN
    return pd.concat([df_new, df2], axis=1)

Демо:

func([100, 300], 25)

дает:

     a   b  c    d    e         f newcolumn1 newcolumn2 newcolumn3 newcolumn4 newcolumn5 newcolumn6
0  100  10  1  www  qqq  1/1/2020         10          1        www        qqq   1/1/2020         15
2  300  30  3  ttt  yyy  3/1/2020        NaN        NaN        NaN        NaN        NaN        NaN
1 голос
/ 10 марта 2020
y=20
new_df = df[df['b'] >= y]
new_df['newcolumn6'] = new_df['b'].apply(lambda x: y-x)

Выход

     a   b  c    d    e         f  newcolumn6
1  200  20  2  eee  rrr  2/1/2020           0
2  300  30  3  ttt  yyy  3/1/2020         -10
3  400  40  4  uuu  iii  4/1/2020         -20
4  500  50  5  ooo  ppp  5/1/2020         -30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...