【问题标题】:pandas groupby on dataframe and assigning back to orignal df fails with transform数据框上的熊猫 groupby 并分配回原始 df 转换失败
【发布时间】:2016-11-21 13:21:03
【问题描述】:

我有以下数据框,列 :ID' 中的某些值重复。 我想按数据农场分组

 df = pd.DataFrame(
    {'Score': [0.65, 0.57, 0.56, 0.689, 0.56, 0.85, 0.45, 0.15, 0.14, 0.4678], 
    'ID': ['AAA', 'BBB', 'SAS', 'SAP', 'TCS', 'BBB', 'CTC', 'CTC', 'CTC', 'CTC'], 
    'Sample': ['AE01', 'AE01', 'AE03', 'AE03', 'AE03', 'AE05', 'AE05', 'AE05', 'AE05', 'AE05'], 
    'Freq': [1, 14, 14, 15, 16, 17, 18, 19, 20, 21], 
    'Type': ['Non', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND']},
    columns=['Sample','ID','Type','Score','Freq'])

当我尝试通过使用transform 遵循单线将其分配给原始数据帧 df 的选项时,将“Re”列添加到 group by 选项中

df['Re']=df.drop_duplicates(['Sample','ID']).groupby(['ID']).transform(size)

我收到以下错误,

ValueError: Wrong number of items passed 4, placement implies 1

我知道我可以进行合并以获取按结果分配给组的原始数据框,但是当我合并时,我会得到某些行,这些行在原始 df 中重复多次,这是我不需要的。任何更好的解决方案都会很棒。 谢谢

【问题讨论】:

    标签: python pandas dataframe group-by assign


    【解决方案1】:

    我认为您需要首先分配drop_duplicates 的新DataFrame 输出,因为显然drop_duplicates 删除了一些重复行(如果存在),因此不能将新列Re 分配给原始df

    另一个问题是需要为 groupby 添加Series[],因为transform 只能与Series 一起使用。如果使用size,可以使用一些不用于分组的列,这里是ID

    df = df.drop_duplicates(['Sample','ID'])
    df['Re']= df.groupby(['ID'])['Sample'].transform('size')
    print (df)
      Sample   ID Type  Score  Freq  Re
    0   AE01  AAA  Non  0.650     1   1
    1   AE01  BBB  IND  0.570    14   2
    2   AE03  SAS  IND  0.560    14   1
    3   AE03  SAP  IND  0.689    15   1
    4   AE03  TCS  IND  0.560    16   1
    5   AE05  BBB  IND  0.850    17   2
    6   AE05  CTC  IND  0.450    18   1
    

    df = df.drop_duplicates(['Sample','ID'])
    df['Re']= df.groupby(['ID'])['Type'].transform('size')
    print (df)
      Sample   ID Type  Score  Freq  Re
    0   AE01  AAA  Non  0.650     1   1
    1   AE01  BBB  IND  0.570    14   2
    2   AE03  SAS  IND  0.560    14   1
    3   AE03  SAP  IND  0.689    15   1
    4   AE03  TCS  IND  0.560    16   1
    5   AE05  BBB  IND  0.850    17   2
    6   AE05  CTC  IND  0.450    18   1
    

    如果不赋值,获取NaN:

    df['Re']= df.drop_duplicates(['Sample','ID']).groupby(['ID'])['Sample'].transform('size')
    print (df)
      Sample   ID Type   Score  Freq   Re
    0   AE01  AAA  Non  0.6500     1  1.0
    1   AE01  BBB  IND  0.5700    14  2.0
    2   AE03  SAS  IND  0.5600    14  1.0
    3   AE03  SAP  IND  0.6890    15  1.0
    4   AE03  TCS  IND  0.5600    16  1.0
    5   AE05  BBB  IND  0.8500    17  2.0
    6   AE05  CTC  IND  0.4500    18  1.0
    7   AE05  CTC  IND  0.1500    19  NaN
    8   AE05  CTC  IND  0.1400    20  NaN
    9   AE05  CTC  IND  0.4678    21  NaN
    

    【讨论】:

    • 很高兴能帮到你!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2021-12-01
    • 2023-01-12
    • 2020-07-21
    • 2016-10-09
    相关资源
    最近更新 更多