#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