【问题标题】:pandas apply function that returns more rows熊猫应用返回更多行的函数
【发布时间】:2019-04-17 03:05:04
【问题描述】:

我有一个包含多个列的数据框,其中一些是列表。在对列表进行一些数据操作之后,我想在每一行上应用一个函数,该函数基本上将每一行扩展为 n 行(每行 n 更改)。

可以在这里看到一个简化的版本:

df = pd.DataFrame({'id':[0,1],'value':[[0,1,2],[3,4]]}).set_index('id')

def func(x):
    v = np.array(x['value'])
    return pd.Series([v,v**2],index=['value','value_2'])

我想要的输出是:

    id  value   value_2
0   0   0   0
1   0   1   1
2   0   2   4
3   1   3   9
4   1   4   16

如果我应用该函数,我会得到一个与原始数据帧具有相同行数的输出,然后我需要对其进行整形:

df.apply(func,axis=1)

    value   value_2
id      
0   [0, 1, 2]   [0, 1, 4]
1   [3, 4]  [9, 16]

有没有一种方法可以在应用函数后无需重新整形就可以得到想要的结果?

【问题讨论】:

  • valuevalue_2 是否总是具有相同的维度?如果value的第三行有7个元素,是否意味着value_2的第三行也有7个元素?
  • 是的。它们总是具有相同的尺寸。

标签: python pandas


【解决方案1】:

你可以unnest然后使用向量化操作:

u = unnest(df.reset_index(), ['id'], ['value'])
u.assign(value_2=u.value**2)

   id  value  value_2
0   0      0       0
1   0      1       1
2   0      2       4
3   1      3       9
4   1      4      16

【讨论】:

    【解决方案2】:

    另一个可能的答案是使用pd.Series + stack

    df = df.value.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'value'}).set_index('id')
    df.apply(func,axis=1)
    print(df)
            value   value_2
        id       
        0   0.0     0.0
        0   1.0     1.0
        0   2.0     4.0
        1   3.0     9.0
        1   4.0     16.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 2023-01-18
      • 2018-05-13
      • 2023-03-16
      • 2022-01-21
      • 1970-01-01
      • 2018-12-20
      相关资源
      最近更新 更多