合并具有相同日期的行的信息

数据挖掘 Python 熊猫
2022-02-08 23:42:01

我的数据如下所示:

date, cardio_time, muscles, muscle_time, stretch_time
2018-01-01, 0, "biceps / lats", 40, 5
2018-01-02, 30, "", 0, 10
2018-01-03, 0, "lats / calf", 41, 6
2018-01-03, 30, "hamstring", 4, 5
2018-01-04, 0, "biceps / lats", 42, 8

我想合并这些具有相同日期的行,并保存两行的信息。转换后我的数据将如下所示,请注意 1 月 3 日已更改:

2018-01-01, 0, "biceps / lats", 40, 5
2018-01-02, 30, "", 0, 10
2018-01-03, 30, "lats / calf / hamstring", 45, 11
2018-01-04, 0, "biceps / lats", 42, 8

我想我可以使用一个 for 循环来检查第 i 行的日期是否与第 i-1 行的日期相同,如果不是,请检查下一行,但如果这些行确实具有相同的日期,则合并这些行一起做这样的事情:

# set default value to 1 exercise per row 
df['nr_excercises'] = 1 
# for loop 
for i in range(1, T):
    if df.index[i] == df.index[i-1]:
      # set nr of nr_excercises to 2
      df.iloc[i, nr_excercises] = 2
      # create temp variables that hold info from both rows 
      cardiotimetot = df[i, cardio_time] +  df[i-1, cardio_time]
      stretchtimetot = df[i, stretch_time] +  df[i-1, stretch_time]
      etc...
      # save temp variables to i
      df.iloc[i, cardio_time] = cardiotimetot
      # drop row i-1
      df = df.drop[df.index[i-1]] # I think this is correct 

问题:这是一个好方法吗?有更好的方法吗?

也许,如果我首先使用 .groupby(df.index).size() 来找出哪些日子有多个条目,然后只将 for 循环应用于 df 的这个子集,那么代码可能会更快。

2个回答

正如@Emre 在评论中指出的那样,您需要一个 pandas 自定义聚合器。

所以既然你需要一个string自定义 join/. 创建一个自定义聚合器为

foo = lambda a: "/".join(a) 

(或者如果您需要连接周围的空格)

foo = lambda a: " / ".join(a) 

然后将熊猫制作groupby

data_.groupby(by='date').agg({'muscle_time': 'sum',
                              'stretch_time': 'sum',
                              'cardio_time': 'sum',
                              'muscles': foo}).reset_index()

这应该为您提供聚合的数据框。

我们可以groupby在“名称”和“月份”列中,然后调用agg()Panda 的 DataFrame 对象的函数。

该函数提供的聚合功能agg()允许在一次计算中计算每个组的多个统计信息。

df.groupby(['date'], as_index = False).agg({'muscles': ','.join})