Pandas- Groupby多列,意思是单列

时间:2017-05-17 15:28:02

标签: python pandas dataframe

我有一个以下结构的大型数据框,为了这个问题,它被简化了:

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

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

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

在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

1 个答案:

答案 0 :(得分: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