【问题标题】:Compare elements from one dataframe and put the output to another dataframe with pandas比较一个数据帧中的元素,并使用 pandas 将输出放入另一个数据帧
【发布时间】:2021-05-12 19:08:22
【问题描述】:

我有两个这样的数据框:

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 但 48 但 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 我把这个问题作为一个新问题,因为另一个问题被编辑了很多次

【问题讨论】:

    标签: python pandas dataframe python-requests compare


    【解决方案1】:

    我们试试吧:

    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
    

    【讨论】:

    • 谢谢,但有些奇怪,它可以在 VS Code 中运行,但它不在 Jupiter 笔记本中。你知道为什么吗?
    • 我刚刚在 Jupyter 笔记本中运行它,它对我来说运行良好。 Pandas 1.2.4 是我使用的 pandas 版本和 Jupyter Notebook 6.3.0。
    猜你喜欢
    • 2017-04-25
    • 2018-10-30
    • 2016-11-17
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多