我有一个带有列的数据框(比如说x
),我想要应用一个非平凡的函数,这将导致多列(固定)和多个(未知)行。有没有办法优雅地做到这一点?
我知道如果您返回Series
,则可以使用多个列执行此操作,但返回DataFrame
个结果会应用返回Series
个数据帧。我的解决方案有点像这样(模拟):
def func(a):
return pd.DataFrame(np.ones((a, 2)), columns=['one', 'two'])
df = pd.DataFrame(data={'x': [1, 2, 1]})
pd.concat(df['x'].apply(func).tolist(), ignore_index=True)
是否有内置的方法可以做到这一点,或者至少有一些不那么人为的已知解决方案?
答案 0 :(得分:1)
在我看来,你的解决方案很好。
您也可以使用list comprehension
:
df1 = pd.concat([func(x) for x in df['x']], ignore_index=True)
print (df1)
one two
0 1.0 1.0
1 1.0 1.0
2 1.0 1.0
3 1.0 1.0
或者有点黑客 - unique default index
level=0
(def func(a):
return pd.DataFrame(np.ones((a.iat[0], 2)), columns=['one', 'two'])
df2 = df.groupby(level=0)['x'].apply(func)
print (df2)
one two
0 0 1.0 1.0
1 0 1.0 1.0
1 1.0 1.0
2 0 1.0 1.0
df2 = df.groupby(level=0)['x'].apply(func).reset_index(drop=True)
print (df2)
one two
0 1.0 1.0
1 1.0 1.0
2 1.0 1.0
3 1.0 1.0
):
{{1}}