【问题标题】:Concatenate rows with same column value in a single pandas dataframe在单个熊猫数据框中连接具有相同列值的行
【发布时间】:2021-02-03 15:34:49
【问题描述】:

我有一个像这样的熊猫数据框:

id code mean count  

1   A    32    22  
1   B    9     56
1   C    25    78
2   A    33    35
2   B    11    66

基本上,对于每个 ID,可能有 N 个条目,并且每个 ID 的 N 会有所不同,对于某些可能是 1,对于某些可能是 3 或更多。我想连接所有具有相同 ID 的行。 我知道某些 ID 的某些列最终会为空,因为与其他 ID 的 N 相比,它们的“N”会更低,所以我想为这些空列填写 -1

最终的数据框将如下所示:

id code1 mean1 count1 code2 mean2 count2 code3 mean3 count3

1   A    32      22    B     9     56     C     25    78
2   A    33      35    B     11    66     -1    -1    -1

请询问可能需要的任何其他信息。

编辑
请注意您使用的是原版 pandas,而不是 modin.pandas 或任何其他版本的 pandas。我在使用 modin.pandas 时尝试执行问题时遇到了问题,但 vanilla pandas 工作得很好。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用GroupBy.cumcount 作为计数器,然后通过DataFrame.set_indexDataFrame.unstack 进行整形,通过DataFrame.sort_index 对第二级MultiIndex 进行排序,最后通过join 将MultiIndex 展平:

    df = pd.DataFrame({'id': [1, 1, 1, 2, 2], 
                       'code': ['A', 'B', 'C', 'A', 'B'],
                       'mean': [32, 9, 25, 33, 11], 
                       'count': [22, 56, 78, 35, 66]})
    
    print (df)
       id code  mean  count
    0   1    A    32     22
    1   1    B     9     56
    2   1    C    25     78
    3   2    A    33     35
    4   2    B    11     66
    
    print (df.columns)
    Index(['id', 'code', 'mean', 'count'], dtype='object')
    
    
    print (df.columns.tolist())
    ['id', 'code', 'mean', 'count']
    

    df['g'] = df.groupby('id').cumcount().add(1)
    df = (df.set_index(['id','g'])
            .unstack(fill_value=-1)
            .sort_index(level=1, axis=1))
    
    df.columns = df.columns.map(lambda x: f'{x[0]}{x[1]}')
    

    要将id 转换为列,请使用reset_index

    df = df.reset_index()
    print (df)
       id code1  count1  mean1 code2  count2  mean2 code3  count3  mean3
    0   1     A      22     32     B      56      9     C      78     25
    1   2     A      35     33     B      66     11    -1      -1     -1
    df = df.reset_index()
    

    【讨论】:

    【解决方案2】:

    我认为这对你有用。如果您想为后缀添加数字,只需添加一个计数器。

    final=pd.DataFrame()
    for i in df['code'].unique():
        final=pd.concat([final,df.query(f'code=="{i}"').set_index('id').add_suffix(f"_{i}")],axis=1).fillna(-1)
    
    
       code_A  mean_A  count_A code_B  mean_B  count_B code_C  mean_C  count_C
    id                                                                        
    1       A      32       22      B       9       56      C    25.0     78.0
    2       A      33       35      B      11       66     -1    -1.0     -1.0
    

    【讨论】:

      猜你喜欢
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 2016-08-23
      相关资源
      最近更新 更多