将函数应用于返回多行的pandas数据帧

时间:2014-08-16 23:03:37

标签: python pandas dataframe

我想将一个函数应用于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()解决的问题,但我不认为这适用于我的情况,因为我实际上并不希望按任何方式进行分组。

这样做的正确方法是什么?

1 个答案:

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

调整索引(如果需要)是微不足道的,并留给读者作为练习。