pandas 在panda Dataframe 中聚合datetime64[ns]和浮点列

bnlyeluc  于 2023-01-07  发布在  其他
关注(0)|答案(1)|浏览(119)

我有一个Pandas Dataframe ,看起来像下面的一个。
| 赛车手|种族时间1|种族时间2|第1个_位置|第二个_位置|...|
| - ------| - ------| - ------| - ------| - ------| - ------|
| 乔什莫|零时二十四分十二秒|钠氮|1个|无||
| 乔什莫|钠氮|零时三十二分四十三秒|无|无||
| 乔什莫|钠氮|零点三十分二十一秒|无|1个||
| 萨利苏|钠氮|零时二十九分五十四秒|1个|无||
我想按参赛者姓名对所有行进行分组,以显示总的比赛时间、地点等。
我正在尝试用

df.groupby('racer', dropna=True).agg('sum')

每一列最初都是作为一个对象dtype加载的,这会在将数字与非空值聚合时产生问题。
对于race_time值,在大量搜索之后,我尝试将列更改为datetime64 [ns] dtype,并为day/month/year提供虚拟数据,但是在调用groupby函数时,race_time列没有求和,而是从 Dataframe 中删除。
当我将1st_Place和2nd_place改为float数据类型时,就会出现相反的问题。当groupby被调用时,聚合会按预期工作,但是每隔一列就会被删除(对象列)。
例如,与乔施莫我想看到:
| 赛车手|种族时间1|种族时间2|第1个_位置|第二个_位置|
| - ------| - ------| - ------| - ------| - ------|
| 乔什莫|零时二十四分十二秒|一点零三分零四秒|1个|1个|
我怎样才能让Pandas像这样聚合我的 Dataframe 呢?

vyu0f0g1

vyu0f0g11#

用途:

#function for formating timedeltas
def f(x):
    ts = x.total_seconds()
    hours, remainder = divmod(ts, 3600)
    minutes, seconds = divmod(remainder, 60)
    return ('{:02d}:{:02d}:{:02d}').format(int(hours), int(minutes), int(seconds))

#convert Place columns to numeric
cols1 = df.filter(like='Place').columns
df[cols1] = df[cols1].apply(pd.to_numeric)

#convert time columns to timedeltas and then to unix time
cols = df.filter(like='time').columns
df[cols] = df[cols].fillna('0').apply(pd.to_timedelta).astype(np.int64)

#aggregate sum
df = df.groupby('racer', dropna=True).sum()

#convert timedeltas to times with formating
df[cols] = df[cols].apply(lambda x: pd.to_timedelta(x).map(f))
print (df)
          race_time_1 race_time_2  1st_Place  2nd_Place
racer                                                  
joe shmo     00:24:12    01:03:04          1          1
sally sue    00:00:00    00:29:54          1          0

相关问题