对返回多行的pandas数据框应用函数
我想对一个pandas的DataFrame应用一个函数,把一些行拆分成两行。比如,我可能有这样的输入:
df = pd.DataFrame([{'one': 3, 'two': 'a'}, {'one': 5, 'two': 'b,c'}], index=['i1', 'i2'])
one two
i1 3 a
i2 5 b,c
我希望输出能变成这样:
one two
i1 3 a
i2_0 5 b
i2_1 5 c
我原本希望可以直接在数据框上使用apply(),调用一个返回包含一行或多行的DataFrame的函数,然后再把这些结果合并起来。但这似乎根本行不通。这里有一个测试案例,我只是想把每一行复制一遍:
dfa = df.apply(lambda s: pd.DataFrame([s.to_dict(), s.to_dict()]), axis=1)
one two
i1 one two
i2 one two
所以,如果我返回一个DataFrame,那里面的列名似乎会变成行的内容。这显然不是我想要的结果。
这里有另一个问题是通过使用.groupby()
解决的,但我觉得这不适合我的情况,因为我并不想按任何东西进行分组。
那正确的做法是什么呢?
1 个回答
2
你的数据库搞得一团糟,原本应该有单独的列,现在却变成了用逗号分隔的字符串。我们首先来修复这个问题:
df2 = pd.concat([df['one'], pd.DataFrame(df.two.str.split(',').tolist(), index=df.index)], axis=1)
这样就能得到更整齐的结果:
In[126]: df2
Out[126]:
one 0 1
i1 3 a None
i2 5 b c
现在,我们可以直接进行下面的操作:
In[125]: df2.set_index('one').unstack().dropna()
Out[125]:
one
0 3 a
5 b
1 5 c
如果你想调整索引,这个很简单,可以留给你自己练习。