【问题标题】:Pandas Apply(axis=1): produce more than one rowPandas Apply(axis=1):产生多于一行
【发布时间】:2015-04-23 20:18:02
【问题描述】:

我想按行应用一个函数,如下所示:

def item_split(row):
    items = json.loads(row['items'])
    out = pd.DataFrame([row for i in range(len(items))])
    out['item'] = items
    return out

tweets = tweets.apply(tag_split, axis=1)

如您所知,此函数旨在获取项目列表并为每个项目创建一行,以复制其余剩余数据。不幸的是,我当前的方法不是 apply 方法的正确用法:

ValueError                                Traceback (most recent call last)
/usr/lib/python3.4/site-packages/pandas/core/common.py in _asarray_tuplesafe(values, dtype)
   2344                 result = np.empty(len(values), dtype=object)
-> 2345                 result[:] = values
   2346             except ValueError:

ValueError: could not broadcast input array from shape (13) into shape (1)

有人知道如何正确执行此操作吗?我有点难过。

【问题讨论】:

  • 能否发布一些数据和您的预期输出?

标签: python pandas


【解决方案1】:

这个问题类似于 Wes McKinney has answeredpandas: apply function to DataFrame that can return multiple rows

假设你的数据是这样的:

In [36]: tweets = pd.DataFrame({
   ....:     'items': [
   ....:         '[{"text": "user1-msg1"},{"text": "user1-msg2"},{"text": "user1-msg3"}]',
   ....:         '[{"text": "user2-msg1"},{"text": "user2-msg2"}]',
   ....:         '[{"text": "user3-msg1"}]',
   ....:     ],
   ....:     'user': ['user1', 'user2', 'user3'],
   ....: })

您可以使用.groupby()group_keys=False 来为每个分组项返回多行:

In [37]: def item_split(group):
   ....:         row = group.irow(0)
   ....:         result = pd.DataFrame(json.loads(row['items']))
   ....:         result['user'] = row['user']
   ....:         return result
   ....:

In [38]: tweets.groupby('items', group_keys=False).apply(item_split)
Out[38]:
         text   user
0  user1-msg1  user1
1  user1-msg2  user1
2  user1-msg3  user1
0  user2-msg1  user2
1  user2-msg2  user2
0  user3-msg1  user3

【讨论】:

    猜你喜欢
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 2014-06-28
    • 2021-03-22
    • 1970-01-01
    相关资源
    最近更新 更多