繁体   English   中英

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

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

我希望能够将一个函数应用于DataFrame (逐行),以便它可以返回不一定具有与原始维度或索引相同的新DataFrame

假设我有一个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

和一个函数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

我需要在上面进行哪些修改才能获得所需的结果?

试试看

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