Saya memiliki dua bingkai data seperti ini:

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

Saya ingin membandingkan jika waktu di kolom "waktu" adalah <24 jam, >24 tetapi <48, >48 tetapi <72 jam dan >72 dan letakkan hasil ini ke kerangka data lain seperti ini:

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 

Jadi, pada dasarnya yang saya inginkan di df2 ini adalah memiliki jumlah file yang memenuhi perbandingan, seperti misalnya ada tiga file di kolom "waktu" milik A dan A_1 dan waktunya adalah 24

Saya mencoba kode ini dari @Andreas tetapi gagal jika tidak ada waktu di kolom "waktu" yang 4872:

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 Saya membuat ini sebagai pertanyaan baru karena yang lain telah diedit berkali-kali

0
user14073111 12 Mei 2021, 22:08

1 menjawab

Jawaban Terbaik

Mari mencoba:

  1. Meliputi Nilai Waktu ke TimeDelta untuk mendapatkan hari
  2. clip untuk memastikan nilai tidak lebih dari 3 hari
  3. Gunakan pivot_table lalu bersihkan kolom
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
1
Henry Ecker 12 Mei 2021, 19:42