【问题标题】:Pandas- Groupby multiple columns and mean from a single columnPandas- Groupby 多列和单列的平均值
【发布时间】:2017-05-17 15:28:01
【问题描述】:

我有以下结构的大型数据框,出于此问题的目的对其进行了简化:

  A     B     C D ... J K 
  date1 time1 1 1 ... 1 1
  date2 time2 2 2 ... 2 2

基本上前 3 列都代表字符串数据,即时间和日期。我从 csv 文件中读取的数据框和时间之后的数据在每一列的一天中有多个点。

我想做的是找到一种方法来按日期对所有数据进行分组,并创建每天的平均值,这些值在一天内包含多个数据点。使用 group.by(dates) 可以很好地处理此问题,但是我丢失了日期列中未包含的所有其他数据,因此结果如下:

group.by().mean() 之前:

   A     B     C D ... J K
   date1 time1 1 1 ... 1 1
   date2 time2 2 2 ... 2 2
   date2 time3 1 1 ... 1 1

之后:

   A      C   D   ... J   K
   date1  1   1       1   1
   date2  1.5 1.5 ... 1.5 1.5

我的理想输出是将数据保留在时间列和日期列中,同时仍根据天数创建平均值。这将导致以下结果:

理想输出:

   A      B     C   D   ... J   K
   date1  time1 1   1       1   1
   date2  time2 1.5 1.5 ... 1.5 1.5

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您还需要具有 stringstimes 的聚合列,例如由first,否则为omited

    因此可能的解决方案是创建dict of aggregation functions 并使用groupby + agg + reset_index + reindex_axis

    print (df)
    
       A      B      C  D  E  J  K
    0  a  date1  time1  1  1  1  1
    1  b  date2  time2  2  2  2  2
    2  c  date2  time3  1  1  1  1
    
    cols = ['A','B','C']
    d = {x:'mean' for x in df.columns.difference(cols)}
    d['A'] = 'first'
    d['C'] = 'first'
    print (d)
    {'E': 'mean', 'D': 'mean', 'J': 'mean', 'A': 'first', 'C': 'first', 'K': 'mean'}
    
    df1 = df.groupby('B').agg(d).reset_index().reindex_axis(df.columns, axis=1)
    print (df1)
       A      B      C    D    E    J    K
    0  a  date1  time1  1.0  1.0  1.0  1.0
    1  b  date2  time2  1.5  1.5  1.5  1.5
    

    【讨论】:

    • 是的,稍作调整以适应我的程序,这就是我想要的,谢谢!
    • 很高兴能帮上忙,美好的一天!
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多