【问题标题】:Aggregate pandas dataframe consistently with the same values以相同的值一致地聚合 pandas 数据框
【发布时间】:2020-03-18 04:41:27
【问题描述】:

我正在尝试从 pandas 数据框中排除不必要的行,并按一列聚合。数据框如下所示:

df1=pd.DataFrame({'date':[20191121]*10,
   'time':[100000]*10,
   'last':[64131,64131,64130,64130,64130,64131,64131,64132,64130,64130],
   'vol':[1]*10})

print(df1)
       date    time   last  vol
0  20191121  100000  64131    1
1  20191121  100000  64131    1
2  20191121  100000  64130    1
3  20191121  100000  64130    1
4  20191121  100000  64130    1
5  20191121  100000  64131    1
6  20191121  100000  64131    1
7  20191121  100000  64132    1
8  20191121  100000  64130    1
9  20191121  100000  64130    1

我想得到这样的数据框:

df2=pd.DataFrame({'date':[20191121]*5,
   'time':[100000]*5,
   'last':[64131,64130,64131,64132,64130],
   'vol':[2,3,2,1,2]})

print(df2)
       date    time   last  vol
0  20191121  100000  64131    2
1  20191121  100000  64130    3
2  20191121  100000  64131    2
3  20191121  100000  64132    1
4  20191121  100000  64130    2

你能帮我解决这个问题吗?

【问题讨论】:

    标签: python pandas indexing group-by aggregate


    【解决方案1】:

    您可以聚合sum,但还需要为lastgroupby 的连续值添加辅助系列:

    g = df1['last'].ne(df1['last'].shift()).cumsum()
    df = df1.groupby(['date','time','last', g], sort=False, as_index=False)['vol'].sum()
    print(df)
           date    time   last  vol
    0  20191121  100000  64131    2
    1  20191121  100000  64130    3
    2  20191121  100000  64131    2
    3  20191121  100000  64132    1
    4  20191121  100000  64130    2
    

    如果想要处理所有 3 列的连续值:

    c = ['date','time','last']
    g = df1[c].ne(df1[c].shift()).any(axis=1).cumsum()
    
    df = df1.groupby(c + [g], sort=False, as_index=False)['vol'].sum()
    print(df)
           date    time   last  vol
    0  20191121  100000  64131    2
    1  20191121  100000  64130    3
    2  20191121  100000  64131    2
    3  20191121  100000  64132    1
    4  20191121  100000  64130    2
    

    【讨论】:

    • 在这种情况下漂亮地使用shift()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2017-02-05
    • 2021-07-16
    • 1970-01-01
    • 2021-10-31
    相关资源
    最近更新 更多