简体   繁体   English

pandas –将功能逐行应用到DataFrame,从而产生不同尺寸的新DataFrame

[英]pandas – apply function to DataFrame row-wise, resulting in a new DataFrame of different dimensions

I want to be able to apply a function to a DataFrame (row-wise) such that it can return a new DataFrame that does not necessarily have the same dimensions or indexing as the original. 我希望能够将一个函数应用于DataFrame (逐行),以便它可以返回不一定具有与原始维度或索引相同的新DataFrame

Let's say I have a DataFrame , df : 假设我有一个DataFramedf

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

and a function foo() : 和一个函数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')
... 

such that 这样

>>> 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

I want to apply foo() to df such that it results in a new DataFrame where the results of running foo() on each row are stacked into a single DataFrame , kind of like 我想将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

However, running df.apply(foo, axis=1) does not return this. 但是,运行df.apply(foo, axis=1)不会返回此值。 Instead I get 相反,我得到

>>> 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

What do I need to modify above to get the results I'm looking for? 我需要在上面进行哪些修改才能获得所需的结果?

Try with 试试看

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM