如何在Python中粘贴(如R)和groupby

时间:2019-01-08 04:36:24

标签: python pandas pandas-groupby

我在将R代码示例转换为脚本时遇到了麻烦,并且想知道如何实现。

product_df <- example_df[,paste(name, collapse="_"),by=product_id]

我在上一个SO问题上找到了此代码段,但这只是将所有内容连接在一起,而不是通过特定的ID。

import functools
def reduce_concat(x, sep=""):
    return functools.reduce(lambda x, y: str(x) + sep + str(y), x)

def paste(*lists, sep=" ", collapse=None):
    result = map(lambda x: reduce_concat(x, sep=sep), zip(*lists))
    if collapse is not None:
        return reduce_concat(result, sep=collapse)
    return list(result)

这是在下面生成原始数据框的代码

example_df = pd.DataFrame({'product_id': ['100_1244', '100_1244', '100_1244', '100_1244', '200_1244', '200_1244', '200_1244', '200_1244'],
                      'name': ['apple', 'apple', 'apple', 'apple', 'orange', 'orange', 'orange', 'orange']})

    product_id  name
0   100_1244    apple
1   100_1244    apple
2   100_1244    apple
3   100_1244    apple
4   200_1244    orange
5   200_1244    orange
6   200_1244    orange 
7   200_1244    orange

我希望它看起来像这样:

    product_id  name
0   100_1244    apple_apple_apple_apple
1   200_1244    orange_orange_orange_orange

2 个答案:

答案 0 :(得分:1)

您可以使用groupby

进行检查
example_df.groupby('product_id').name.apply('_'.join).reset_index()

  product_id                         name
0   100_1244      apple_apple_apple_apple
1   200_1244  orange_orange_orange_orange

答案 1 :(得分:1)

groupbyjoin一起使用

df.groupby('product_id').apply(lambda x: '_'.join(x['name']))

product_id
100_1244        apple_apple_apple_apple
200_1244    orange_orange_orange_orange