我想将一个函数应用于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(),调用一个函数返回一个本身有1行或更多行的数据帧,然后将它们合并回来。但是,这似乎根本不起作用。这是一个测试用例,我只是想复制每一行:
dfa = df.apply(lambda s: pd.DataFrame([s.to_dict(), s.to_dict()]), axis=1)
one two
i1 one two
i2 one two
因此,如果我返回一个DataFrame,那个DataFrame的列名似乎成为行的内容。这显然不是我想要的。
此处还有另一个问题是使用.groupby()
解决的问题,但我不认为这适用于我的情况,因为我实际上并不希望按任何方式进行分组。
这样做的正确方法是什么?
答案 0 :(得分: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
调整索引(如果需要)是微不足道的,并留给读者作为练习。