我有一个以下结构的大型数据框,为了这个问题,它被简化了:
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
答案 0 :(得分:1)
问题是您需要使用strings
和times
的汇总列,例如按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