【问题标题】:Concatenate several rows into one row by column value, and split resulting dataframe into several dataframes based on number of concatinated rows将几行按列值连接成一行,并根据连接的行数将生成的数据帧拆分为多个数据帧
【发布时间】:2019-10-19 14:06:41
【问题描述】:

我有一个 pandas 数据框,其中几行共享特定的列值。对于这些行,我想将这些行连接成一行。并且单个共享列值的行数存在差异,我想将这些数据帧拆分为它们自己单独的数据帧,因此特定数量的共享行的唯一数据帧。

这是我想要的一个例子。

import pandas as pd

data = [['tom', 2], ['ni2ck', 2], ['j3uli', 4] , ['nic4k', 4], ['jul5i', 4] , ['nic6k', 7], ['ju7li', 7] , ['nic8k', 7], ['ju9li', 7] , ['nic1k', 8], ['car', 8]]
df = pd.DataFrame(data, columns = ['Name', 'Age']) 
df 

上面的代码生成原始数据框的样子

结果是

Name    Age
0   tom 2
1   ni2ck   2
2   j3uli   4
3   nic4k   4
4   jul5i   4
5   nic6k   7
6   ju7li   7
7   nic8k   7
8   ju9li   7
9   nic1k   8
10  car 8

我想将共享同一 Age 列的所有行放在一行中,然后根据为每个共享行生成的列数分隔数据框。所以结果应该是这样的

第一个结果数据帧,它有两行,因为有两行共享相同的列数。

Name    Name    Age
0   tom ni2ck   2
1   nic1k   car 8

第二个结果数据帧

Name    Name    Name    Age
0   j3uli   nic4k   jul5i   4

第三个结果数据框

    Name    Name    Name    Name    Age
0   nic6k   ju7li   nic8k   ju9li   7

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这是一种方法

    df['New']=df.groupby('Age').cumcount()
    s=df.pivot(index='Age',columns='New',values='Name')
    l=[ y.dropna(1) for _ , y in s.groupby(s.isnull().sum(1))]
    l[0]
    New      0      1      2      3
    Age                            
    7    nic6k  ju7li  nic8k  ju9li
    l[1]
    New      0      1      2
    Age                     
    4    j3uli  nic4k  jul5i
    l[2]
    New      0      1
    Age              
    2      tom  ni2ck
    8    nic1k    car
    

    【讨论】:

      【解决方案2】:

      使用collections.defaultdict

      from collections import defaultdict
      
      d = defaultdict(list)
      
      for age, df_ in df.groupby('Age'):
          d[len(df_.T.columns)].append(df_.reset_index(drop=True).T.loc[['Name']].assign(Age=age))
      
      d = {k: pd.concat(v, ignore_index=True ) for k,v in d.items()}
      

      然后,按名称的数量访问数据框。例如,

      >>> d[2]
      

             0      1  Age
      0    tom  ni2ck    2
      1  nic1k    car    8
      

      >>> d[3]
      

             0      1      2  Age
      0  j3uli  nic4k  jul5i    4
      

      【讨论】:

        猜你喜欢
        • 2020-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多