pandas – применить функцию к фрейму данных по строкам, в результате чего создается новый фрейм данных разных измерений

#python #pandas

#питон #панды #python #pandas

Вопрос:

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

Допустим, у меня есть DataFrame , df :

     A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3
  

и функция foo() :

 >>> def foo(series):
...  series['E'] = 'NEW_STUFF'
...  series['F'] = 'MORE_NEW_STUFF'
...  df = pd.DataFrame(series.drop('B')).transpose()
...  return pd.concat([df,df], keys='qw')
... 
  

такой, что

 >>> foo(df.iloc[0])
      A   C   D          E               F
q 0  A0  C0  D0  NEW_STUFF  MORE_NEW_STUFF
w 0  A0  C0  D0  NEW_STUFF  MORE_NEW_STUFF
  

Я хочу применить foo() к df таким образом, чтобы это привело к созданию нового, DataFrame где результаты выполнения foo() в каждой строке складываются в одну DataFrame , что-то вроде

       A   C   D          E               F
q 0  A0  C0  D0  NEW_STUFF  MORE_NEW_STUFF
w 0  A0  C0  D0  NEW_STUFF  MORE_NEW_STUFF
q 1  A1  C1  D1  NEW_STUFF  MORE_NEW_STUFF
w 1  A1  C1  D1  NEW_STUFF  MORE_NEW_STUFF
q 2  A2  C2  D2  NEW_STUFF  MORE_NEW_STUFF
w 2  A2  C2  D2  NEW_STUFF  MORE_NEW_STUFF
q 3  A3  C3  D3  NEW_STUFF  MORE_NEW_STUFF
w 3  A3  C3  D3  NEW_STUFF  MORE_NEW_STUFF
  

Однако запуск df.apply(foo, axis=1) не возвращает это значение. Вместо этого я получаю

 >>> df.apply(foo, axis=1)
0          A   C   D          E               F
q 0...
1          A   C   D          E               F
q 1...
2          A   C   D          E               F
q 2...
3          A   C   D          E               F
q 3...
dtype: object
  

Что мне нужно изменить выше, чтобы получить результаты, которые я ищу?

Ответ №1:

Попробуйте с

 pd.concat([foo(y) for _,y in df.iterrows()])
Out[64]: 
      A   C   D          E               F
q 0  A0  C0  D0  NEW_STUFF  MORE_NEW_STUFF
w 0  A0  C0  D0  NEW_STUFF  MORE_NEW_STUFF
q 1  A1  C1  D1  NEW_STUFF  MORE_NEW_STUFF
w 1  A1  C1  D1  NEW_STUFF  MORE_NEW_STUFF
q 2  A2  C2  D2  NEW_STUFF  MORE_NEW_STUFF
w 2  A2  C2  D2  NEW_STUFF  MORE_NEW_STUFF
q 3  A3  C3  D3  NEW_STUFF  MORE_NEW_STUFF
w 3  A3  C3  D3  NEW_STUFF  MORE_NEW_STUFF