大熊猫在同一行中合并相同的值

时间:2018-08-29 10:40:32

标签: python python-3.x pandas dataframe pandas-groupby

有以下数据:

g = randint(1,3)

将“ board_href_deals”分组后, 我想以列表格式输出现有数据,如下所示:

  board_href_deals       items  test1
0            test2  {'x': 'a'}  test1
1            test2  {'x': 'b'}  test2

谢谢

2 个答案:

答案 0 :(得分:2)

使用pandas 0.23.4中测试过的DataFrameGroupBy.agg

df = df.groupby('board_href_deals', as_index=False).agg(list)
print (df)
  board_href_deals                     items           test1
0            test2  [{'x': 'a'}, {'x': 'b'}]  [test1, test2]

感谢@jpp为较旧的熊猫提供解决方案:

df = df.groupby('board_href_deals').agg(lambda x: list(x))

答案 1 :(得分:1)

另一种解决方案(尤其是在较早版本的Pandas上)是在序列上使用GroupBy + apply,然后通过concat进行组合。

在Python 3.60 / Pandas 0.19.2上进行基准测试。这个人为的例子只有少数几个组。如果您担心效率问题,应该使用数据进行测试。

import pandas as pd

df = pd.DataFrame({'A': ['test2', 'test2', 'test4', 'test4'],
                   'B': [{'x': 'a'}, {'x': 'b'}, {'y': 'a'}, {'y': 'b'}],
                   'C': ['test1', 'test2', 'test3', 'test4']})

df = pd.concat([df]*10000)

def jpp(df):
    g = df.groupby('A')
    L = [g[col].apply(list) for col in ['B', 'C']]
    return pd.concat(L, axis=1).reset_index()

%timeit jpp(df)                                 # 11.3 ms per loop
%timeit df.groupby('A').agg(lambda x: list(x))  # 20.5 ms per loop