比较一个数据帧中的元素,并将输出放入另一个带有 Pandas 的数据帧

问题描述

我有两个这样的数据框:

df1:

     col1    col2          time
0    A        A_1          05:02:03
1    A        A_2          15:36:14
2    A        A_1          28:21:47
3    A        A_1          47:21:17
4    A        A_1          32:28:01
5    A        A_2          37:27:14

我想比较“时间”列中的时间是否为 24 but 48 but 72 并将这些结果放入另一个数据框,如下所示:

df2:

     col1    col2      time <24       24<time<48       48<time<72    time>72
0    A        A_1          1              3              NaN            NaN
1    A        A_2          1              1              NaN            NaN 

所以,基本上我在这个 df2 中想要的是满足比较的文件数,例如“时间”列中有三个文件属于 A 和 A_1,时间为 24

我从@Andreas 尝试了这段代码,但是如果“时间”列中没有时间 48

df['day'] = (df['time'].str.split(':').str[0].astype(int)/24).astype(int)
df = df.pivot_table(index=['col1','col2'],columns=['day'],values=['time'],aggfunc='count').reset_index()

d = {'time0':'time <24','time1':'24<time<48','time2':'48<time<72','time3':'time>72'}
df.columns = [d.get(''.join(map(str,x)),''.join(map(str,x))) for x in df.columns]

p.s 我把这个作为一个新问题,因为另一个被编辑了很多次

解决方法

让我们试试:

  1. 将时间值转换为 TimeDelta 以获取天数
  2. clip 以确保值不超过 3 天
  3. 使用 pivot_table 然后清理列
import numpy as np
import pandas as pd

df = pd.DataFrame({'col1': {0: 'A',1: 'A',2: 'A',3: 'A',4: 'A',5: 'A'},'col2': {0: 'A_1',1: 'A_2',2: 'A_1',3: 'A_1',4: 'A_1',5: 'A_2'},'time': {0: '05:02:03',1: '15:36:14',2: '28:21:47',3: '47:21:17',4: '32:28:01',5: '37:27:14'}})

df['days'] = (
    pd.to_timedelta(df['time']).dt.days  # Get Days from Time Delta
        .clip(lower=0,upper=3)  # Clip at 3 Days
)

time_cols = ['time < 24','24 <= time < 48','48 <= time < 72','time >= 72']
df = (
    df.pivot_table(index=['col1','col2'],columns='days',aggfunc='count',fill_value=np.nan)
        .droplevel(0,1)  # Remove Column Multi Index
        .reset_index()  # Reset index
        .rename_axis(None,axis=1)  # Remove Axis Name
        .rename(columns={i: v for i,v in enumerate(time_cols)})
)

# Add Missing Columns
df[list(set(time_cols).difference(df.columns))] = np.nan

# Reorder Columns
df = df[['col1','col2',*time_cols]]
print(df)

df

  col1 col2  time < 24  24 <= time < 48  48 <= time < 72  time >= 72
0    A  A_1          1                3              NaN         NaN
1    A  A_2          1                1              NaN         NaN