代码之家  ›  专栏  ›  技术社区  ›  Khalil Al Hooti

根据条件将列行与前几行合并

  •  1
  • Khalil Al Hooti  · 技术社区  · 5 月前

    我有这个CSV文件(一个非常大的文件的一部分)

    课程/章节 信用 课程名称 时间 建筑物 教练 考试日期 课程语言
    ACCT1112/10 3. 金融入门 周一 CMT/E07 xxxxxxx 8/5/2022 英语
    会计 08:00-09:50 太阳
    08:00-11:00
    E15
    2011年11月11日 3. 金融入门 结婚 CMT/E07 xxxxxxx 英语
    会计 08:00-09:50
    ACCT1112/20 3. 金融入门 周一 CMT/E05 xxxxxxx 8/5/2022 英语
    会计 10:00-11:50 太阳
    08:00-11:00
    E16
    ACCT1112/21 3. 金融入门 结婚 CMT/E05 xxxxxxx 英语
    会计 10:00-11:50
    ACCT1112/30 3. 金融入门 周一 CMT/E06 xxxxxxx 8/5/2022 英语
    会计 12:00-13:50 太阳
    08:00-11:00
    E17
    ACCT1112/31 3. 金融入门 结婚 CMT/E06 xxxxxxx 英语
    会计 12:00-13:50
    ACCT1112/40 3. 金融入门 周一 CMT/E23 xxxxxxx 8/5/2022 英语
    会计 14:15-16:05 太阳
    08:00-11:00
    E18
    ACCT1112/41 3. 金融入门 结婚 CMT/E23 xxxxxxx 英语
    会计 14:15-16:05
    ACCT1112/50 3. 金融入门 太阳 CMT/E27 xxxxxxx 8/5/2022 英语
    会计 10:00-11:50 太阳
    08:00-11:00
    E19
    ACCT1112/51 3. 金融入门 清华大学 CMT/E27 xxxxxxx 英语
    会计 10:00-11:50
    ACCT1112/60 3. 金融入门 星期二 CMT/E16 xxxxxxx-1 8/5/2022 英语
    会计 10:00-11:50 xxxxxxx-2 太阳
    08:00-11:00
    E20
    ACCT1112/61 3. 金融入门 清华大学 CMT/E16 mmmmm-1 英语
    会计 08:00-09:50 mmmmm-2

    我想把它转换成

    课程/章节 信用 课程名称 时间 建筑物 教练 考试日期 课程语言
    ACCT1112/10 3. 初级财务会计 周一08:00-09:50 CMT/E07 xxxxxxx 2022年8月5日星期日08:00-11:00 E15 英语
    2011年11月11日 3. 初级财务会计 婚礼08:00-09:50 CMT/E07 xxxxxxx 英语
    ACCT1112/20 3. 初级财务会计 周一10:00-11:50 CMT/E05 xxxxxxx 2022年8月5日星期日08:00-11:00 E16 英语
    ACCT1112/21 3. 初级财务会计 婚礼10:00-11:50 CMT/E05 xxxxxxx 英语
    ACCT1112/30 3. 初级财务会计 周一12:00-13:50 CMT/E06 xxxxxxx 2022年8月5日星期日08:00-11:00 E17 英语
    ACCT1112/31 3. 初级财务会计 婚礼12:00-13:50 CMT/E06 xxxxxxx 英语
    ACCT1112/40 3. 初级财务会计 周一14:15-16:05 CMT/E23 xxxxxxx 2022年8月5日星期日08:00-11:00 E18 英语
    ACCT1112/41 3. 初级财务会计 结婚14:15-16:05 CMT/E23 xxxxxxx 英语
    ACCT1112/50 3. 初级财务会计 周日10:00-11:50 CMT/E27 xxxxxxx 2022年8月5日星期日08:00-11:00 E19 英语
    ACCT1112/51 3. 初级财务会计 周四10:00-11:50 CMT/E27 xxxxxxx 英语
    ACCT1112/60 3. 初级财务会计 周二10:00-11:50 CMT/E16 xxxxxxx-1 xxxxxxx-2 2022年8月5日星期日08:00-11:00 E20 英语
    ACCT1112/61 3. 初级财务会计 然后08:00-09:50 CMT/E16 毫米毫米-1毫米-2毫米 英语

    我试过了

    for i in range(len(df) - 1, 0, -1):
        if pd.isna(df.loc[i, 'Course/Section']):
            for col in df.columns:
                if pd.notna(df.loc[i, col]):
                    df.loc[i - 1, col] = f"{df.loc[i - 1, col]} {df.loc[i, col]}" if pd.notna(df.loc[i - 1, col]) else df.loc[i, col]
    
    
    df = df.dropna(subset=['Course/Section']).reset_index(drop=True)
    

    但我的代码似乎没有按预期工作。

    因此,我想将行值与前一个值连接起来,从下到上逐一连接,只要列长 Course/Section 直到我走到那排 课程/章节 不是空的

    1 回复  |  直到 5 月前
        1
  •  3
  •   e-motta    5 月前

    根据列中的现有值创建组 'Course/Section' 具有 cumsum 那么 groupby 并聚合每个组中的值:

    g = df["Course/Section"].notna().cumsum()
    df = (
        df.fillna("")
        .groupby(g, as_index=False)
        .agg(lambda x: " ".join(x.astype(str)).strip())
    )
    
       Course/Section Credits                        Course Name             Time Building           Instructor                     Exam Date Course Language
    0     ACCT1112/10     3.0  Introductory Financial Accounting  MON 08:00-09:50  CMT/E07              xxxxxxx  8/5/2022 SUN 08:00-11:00 E15         English
    1     ACCT1112/11     3.0  Introductory Financial Accounting  WED 08:00-09:50  CMT/E07              xxxxxxx                                       English
    2     ACCT1112/20     3.0  Introductory Financial Accounting  MON 10:00-11:50  CMT/E05              xxxxxxx  8/5/2022 SUN 08:00-11:00 E16         English
    3     ACCT1112/21     3.0  Introductory Financial Accounting  WED 10:00-11:50  CMT/E05              xxxxxxx                                       English
    4     ACCT1112/30     3.0  Introductory Financial Accounting  MON 12:00-13:50  CMT/E06              xxxxxxx  8/5/2022 SUN 08:00-11:00 E17         English
    5     ACCT1112/31     3.0  Introductory Financial Accounting  WED 12:00-13:50  CMT/E06              xxxxxxx                                       English
    6     ACCT1112/40     3.0  Introductory Financial Accounting  MON 14:15-16:05  CMT/E23              xxxxxxx  8/5/2022 SUN 08:00-11:00 E18         English
    7     ACCT1112/41     3.0  Introductory Financial Accounting  WED 14:15-16:05  CMT/E23              xxxxxxx                                       English
    8     ACCT1112/50     3.0  Introductory Financial Accounting  SUN 10:00-11:50  CMT/E27              xxxxxxx  8/5/2022 SUN 08:00-11:00 E19         English
    9     ACCT1112/51     3.0  Introductory Financial Accounting  THU 10:00-11:50  CMT/E27              xxxxxxx                                       English
    10    ACCT1112/60     3.0  Introductory Financial Accounting  TUE 10:00-11:50  CMT/E16  xxxxxxx-1 xxxxxxx-2  8/5/2022 SUN 08:00-11:00 E20         English
    11    ACCT1112/61     3.0  Introductory Financial Accounting  THU 08:00-09:50  CMT/E16      mmmmm-1 mmmmm-2                                       English