【问题标题】:Arrange horizontal DF entries according to another DF根据另一个 DF 排列水平 DF 条目
【发布时间】:2020-10-24 10:53:26
【问题描述】:

我的 DataFrame 1 如下所示:

ID   group_1     area_1     group_2     area_2     group_3    area_3
        
1    basketball  250        scoccer     500        swimming   100
2    volleyball  100        np.nan      np.nan     np.nan     np.nan
3    football    10         basketball  1000       np.nan     np.nan

我有另一个像这样的 DF2

ID   group_1     area_1    group_2     area_2  group_3    area_3  group_4   area_4
        
1    scoccer     500       basketball  50      basketball 200     swimming  100
2    volleyball  np.nan    np.nan      np.nan  np.nan     np.nan  np.nan    np.nan
3    basketball  1000      basketball  np.nan  football   10      np.nan    np.nan

我想要的输出应该是这样的:

ID   group_1     area_1     group_2     area_2     group_3    area_3
        
1    scoccer     500        basketball  250        swimming   100
2    volleyball  100        np.nan      np.nan     np.nan     np.nan
3    basketball  1000       football    10         np.nan     np.nan

我想用 DF2 的结构排列 DF1,这意味着作为第一步,我需要确定 DF2(足球、篮球、游泳)中排列很重要的独特水平表达式。然后按照这种排列方式对 DF1 进行排序(但保留 area_x 中的正确值)。

编辑: 在@kait 的回答下,final_df 是这样的:

ID group_1    area_1  group_2  group_3    area_3  group_4 group_5   area_5  group_6  
        
1  scoccer    500     500      basketball 250     250     swimming  100     100
2  volleyball 100     100      np.nan     np.nan  np.nan  np.nan    np.nan  np.nan
3  basketball 1000    1000     football   10      10      np.nan    np.nan  np.nan

【问题讨论】:

    标签: python pandas dataframe sorting unique


    【解决方案1】:

    这行得通吗?

    首先,重塑df1

    new_rows = []
    for k, v in df.iterrows():
        for group in range(1,4):
            new_rows.append([v['ID'], v[f'group_{group}'], v[f'area_{group}']])
    
    new_df = pd.DataFrame(new_rows, columns=['ID', 'group', 'area']).dropna()
    
    display(new_df)
       ID       group  area
    0   1  basketball   250
    1   1     scoccer   500
    2   1    swimming   100
    3   2  volleyball   100
    6   3    football    10
    7   3  basketball  1000
    

    接下来,解析df2:

    parsed_rows = []
    def parse_df2(row):
        x = {}
        x['ID'] = row['ID']
        groups = [v for k, v in row.items() if 'group' in k or k == 'ID']
        deduped = [groups[i]
                   for i
                   in range(len(groups))
                   if (i == 0)
                   or groups[i] != groups[i - 1]]
        print(deduped)
        for k, v in enumerate(deduped):
            if k == 0 or pd.isna(v):
                continue
            x[f'group_{k}'] = v
            mask = new_df.ID == row['ID']
            mask &= new_df.group == v
            if new_df[mask].empty:
                continue
            x[f'area_{k}'] = new_df[mask]['area'].iloc[0]
    
        parsed_rows.append(x)
    df2.apply(lambda x: parse_df2(x), axis=1)
    final_df = pd.DataFrame(parsed_rows)
    
    display(final_df)
     ID     group_1  area_1     group_2  area_2   group_3  area_3
      1     scoccer     500  basketball   250.0  swimming   100.0
      2  volleyball     100         NaN     NaN       NaN     NaN
      3  basketball    1000    football    10.0       NaN     NaN
    

    【讨论】:

    • 不幸的是,重塑 df1 是可行的,但是使用我得到的函数解析 df2:IndexError: single positional indexer is out-of-bounds。有什么想法吗?
    • 你能发布完整的错误吗?查看导致它失败的代码行会很有帮助
    • 我编辑了最初的帖子,因为评论太长了...
    • df2中group_4列的swim下的值是多少?我看到其他空值存储为 np.nan
    • np.nan 也是如此。 DF2 中的数据类型是字符串、浮点数和 NaN(我猜又是浮点数)。在 DF2 中有组(例如 group_10)在组中具有表达式,但在区域中没有值。 (例如 group_10:排球,area_10:np.nan)。也许这是个问题?
    猜你喜欢
    • 2020-04-06
    • 2017-04-22
    • 1970-01-01
    • 2019-11-02
    • 2022-12-03
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多