对返回多行的pandas数据框应用函数

1 投票
1 回答
1934 浏览
提问于 2025-04-18 17:32

我想对一个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

如果你想调整索引,这个很简单,可以留给你自己练习。

撰写回答