【问题标题】:Pandas DataFrame : How to groupby and sort "by blocks"?Pandas DataFrame:如何对“按块”进行分组和排序?
【发布时间】:2022-08-15 04:22:07
【问题描述】:

我正在使用包含如下数据的 DataFrame,并以两种不同的方式对数据进行分组。

>>> d = {
     \"A\": [100]*7 + [200]*7,
     \"B\": [\"one\"]*4 + [\"two\"]*3 + [\"one\"]*3 + [\"two\"]*4,
     \"C\": [\"foo\"]*3 + [\"bar\"] + [\"foo\"] + [\"bar\"]*2 + [\"foo\"]*2 + [\"bar\"] + [\"foo\"]*3 + [\"bar\"],
     \"D\": [\"yay\"] + [\"nay\"]*2 + [\"yay\"] + [\"nay\"]*3 + [\"yay\"] + [\"nay\"] + [\"yay\"]*3 + [\"nay\"] + [\"yay\"],
     \"X\": [2, 8, 3, 5, 1, 4, 3, 2, 6, 5, 1, 2, 4, 7]
    }

>>> df = pd.DataFrame(d)
>>> df

     A    B    C    D    X
0  100  one  foo  yay    2
1  100  one  foo  nay    8
2  100  one  foo  nay    3
3  100  one  bar  yay    5
4  100  two  foo  nay    1
5  100  two  bar  nay    4
6  100  two  bar  nay    3
7  200  one  foo  yay    2
8  200  one  foo  nay    6
9  200  one  bar  yay    5
10 200  two  foo  yay    1
11 200  two  foo  yay    2
12 200  two  foo  nay    4
13 200  two  bar  yay    7

>>> df_grp = df.groupby([\'A\', \'B\'])
>>> df_grp_sorted = df_grp.sum().sort_values(\'X\', ascending = False)
>>> df_grp_long = df.groupby([\'A\', \'B\', \'C\', \'D\'])
>>> df_grp_sorted_long = df_grp_long.sum().sort_values(\'X\', ascending = False)

这给了我们:

>>> df_grp_sorted

            X
100  one   18
200  two   14
     one   13
100  two    8


>>> df_grp_sorted_long

                      X
100  one  foo  nay   11
     two  bar  nay    7
200  two  bar  yay    7
     one  foo  nay    6
100  one  bar  yay    5
200  one  bar  yay    5
     two  foo  nay    4
               yay    3
100  one  foo  yay    2
200  one  foo  yay    2    
100  two  foo  nay    1

现在,我想了解 df_grp_sorted_long 的详细信息,其结构为 df_grp_sorted。那将是:

>>> df_result

                      X
100  one  foo  nay   11
               yay    5
          foo  yay    2
200  two  bar  yay    7
          foo  nay    4
               yay    3
     one  foo  nay    6
          bar  yay    5
          foo  yay    2    
100  two  bar  nay    7
          foo  nay    1
          

我已经使用以下代码完成了此操作(这违背了this post\ 的建议):

>>> col_names = [\'A\', \'B\', \'C\', \'D\']
>>> df_result = pd.DataFrame(columns=col_names)
>>> for (i, (a, b)) in enumerate(df_grp_sorted.index):
        df_result = pd.concat(
            (
                df_result,
                (df[(df[\'A\']==a) & (df[\'B\']==b)]
                .groupby(col_names)
                .sum()
                .sort_values(\'X\', ascending=False)
                )
            )
        )
>>> df_result = df_result[\"X\"]

这给出了正确的答案,但对于大数据集来说非常慢。我还想知道是否有一种本地方式来进行这种分组/排序的组合。

另外,也许这种方法不是正确的,有一种更简单的方法可以获得等效结果的结果?

    标签: python pandas dataframe sorting pandas-groupby


    【解决方案1】:

    另一种方法是合并两个帧。使用您在上面提供的内容:

    import pandas as pd
    
    d = {"A": [100] * 7 + [200] * 7,
         "B": ["one"] * 4 + ["two"] * 3 + ["one"] * 3 + ["two"] * 4,
         "C": ["foo"] * 3 + ["bar"] + ["foo"] + ["bar"] * 2 + ["foo"] * 2 + ["bar"] + ["foo"] * 3 + ["bar"],
         "D": ["yay"] + ["nay"] * 2 + ["yay"] + ["nay"] * 3 + ["yay"] + ["nay"] + ["yay"] * 3 + ["nay"] + ["yay"],
         "X": [2, 8, 3, 5, 1, 4, 3, 2, 6, 5, 1, 2, 4, 7]}
    
    df = pd.DataFrame(data=d)
    df_grp_sorted = df.groupby(["A", "B"], as_index=False).sum().sort_values("X", ascending=False)
    df_grp_long = df.groupby(["A", "B", "C", "D"], as_index=False)
    df_grp_sorted_long = df_grp_long.sum().sort_values("X", ascending=False)
    df_result = (df_grp_sorted
                 .merge(df_grp_sorted_long, how="outer", on=["A", 'B'])
                 .drop(columns=["X_x"])
                 .rename(columns={"X_y": "X"}))
    

    输出

    A B C D X
    100 one foo nay 11
    100 one bar yay 5
    100 one foo yay 2
    200 two bar yay 7
    200 two foo nay 4
    200 two foo yay 3
    200 one foo nay 6
    200 one bar yay 5
    200 one foo yay 2
    100 two bar nay 7
    100 two foo nay 1

    【讨论】:

      猜你喜欢
      • 2018-08-22
      • 2016-09-14
      • 1970-01-01
      • 2014-05-15
      • 2013-12-06
      • 2016-12-01
      • 2014-11-29
      • 1970-01-01
      • 2021-11-21
      相关资源
      最近更新 更多