【问题标题】:Pandas Groupby Unique Multiple ColumnsPandas Groupby 独特的多列
【发布时间】:2018-05-06 04:13:00
【问题描述】:

我有一个数据框。

import pandas as pd
df = pd.DataFrame(           
{'number': [0,0,0,1,1,2,2,2,2], 'id1': [100,100,100,300,400,700,700,800,700], 'id2': [100,100,200,500,600,700,800,900,1000]})

   id1   id2  number
0  100   100       0
1  100   100       0
2  100   200       0
3  300   500       1
4  400   600       1
5  700   700       2
6  700   800       2
7  800   900       2
8  700  1000       2

(这代表我正在处理的更大的数据框~数百万行)。

我可以将groupby().unique 应用于一列:

df.groupby(['number'])['id1'].unique()

number
0         [100]
1    [300, 400]
2    [700, 800]
Name: id1, dtype: object

df.groupby(['number'])['id2'].unique()

number
0               [100, 200]
1               [500, 600]
2    [700, 800, 900, 1000]
Name: id2, dtype: object

我想同时对两列进行唯一操作,以使其在数据框中排序:

number
0               [100, 200]
1     [300, 400, 500, 600]
2    [700, 800, 900, 1000]

当我尝试对两列都这样做时,我得到了错误:

pd.Data.Frame(df.groupby(['number'])['id1', 'id2'].unique())

Traceback (most recent call last):
  File "C:\Python34\lib\site-packages\IPython\core\interactiveshell.py", line 2885, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-15-bfc6026e241e>", line 9, in <module>
    df.groupby(['number'])['id1', 'id2'].unique()
  File "C:\Python34\lib\site-packages\pandas\core\groupby.py", line 498, in __getattr__
    (type(self).__name__, attr))
AttributeError: 'DataFrameGroupBy' object has no attribute 'unique'

做什么?是否最好使用多索引?

编辑:另外是否可以得到如下输出:

number
0 100
0 200
1 300
1 400
1 500
1 600
2 700
2 800
2 900
2 1000

【问题讨论】:

    标签: python python-3.x pandas group-by


    【解决方案1】:

    您可以通过[]选择所有列:

    s = (df.groupby(['number'])['id1', 'id2']
           .apply(lambda x: pd.unique(x.values.ravel()).tolist()))
    
    print (s)
    number
    0               [100, 200]
    1     [300, 500, 400, 600]
    2    [700, 800, 900, 1000]
    dtype: object
    

    或者:

    s2 = (df.groupby(['number'])['id1', 'id2']
            .apply(lambda x: np.unique(x.values.ravel()).tolist()))
    print (s2)
    number
    0               [100, 200]
    1     [300, 400, 500, 600]
    2    [700, 800, 900, 1000]
    dtype: object
    

    编辑:

    如果需要输出为列,先用stack整形,然后drop_duplicates

    df1 = (df.set_index('number')[['id1', 'id2']]
             .stack()
             .reset_index(level=1, drop=True)
             .reset_index(name='a')
             .drop_duplicates())
    print (df1)
        number     a
    0        0   100
    5        0   200
    6        1   300
    7        1   500
    8        1   400
    9        1   600
    10       2   700
    13       2   800
    15       2   900
    17       2  1000
    

    【讨论】:

    • 很好的回答,谢谢!是否可以扩展这些列表以看起来像我的编辑?
    • 我为它添加了更好的解决方案。
    • 完美 - 谢谢 :)
    猜你喜欢
    • 2023-01-26
    • 1970-01-01
    • 2021-09-23
    • 2017-01-28
    • 1970-01-01
    • 2022-06-30
    • 2015-10-15
    • 1970-01-01
    相关资源
    最近更新 更多