【问题标题】:How to force Pandas apply to return all columns of parent dataframe?如何强制 Pandas 应用返回父数据框的所有列?
【发布时间】:2019-09-15 22:29:57
【问题描述】:

在数据框的某些列上使用 groupby 后,随后使用 apply 来测试字符串是否存在于另一列中,pandas 仅返回那些分组的列以及使用 apply 创建的最后一列。是否可以返回与 groupby 关联的所有列并进行测试?例如,按对话线程的唯一标识符进行分组,并测试字符串是否存在于另一列中,然后包含数据框中存在但属于特定组的其他一些列?

我尝试使用 groupby,然后使用 apply 匿名函数。

df.head()

 shipment_id shipper_id courier_id  Question                                sender
0   14      9962    228898  Let's get your furbabys home Apple pet transpo...   courier
1   91919   190872  196838  Hi I'm kevin thims and I'm happy to do the job...   courier
2   92187   191128  196838  Hi I'm kevin thims and I'm happy to do the job...   shipper

unique_thread_indentifier = ['shipment_id', 'shipper_id', 'courier_id']
required_variables = ['shipment_id', 'shipper_id', 'courier_id', 'Question', 'sender']

df_new = (
    df
    .groupby(unique_thread_indentifier)[required_variables]
    .apply(lambda group: 'shipper' in group['sender'].unique())
    .to_frame(name='shipper_replied')
    .reset_index()
)

df_new.head()
    shipment_id shipper_id  courier_id  shipper_replied
0   14      9962            228898          False
1   91919   190872          196838          False
2   92187   191128          196838          True

我的目标是将Questionsender 列重新包含在最终数据框中。预期输出如下所示:

 shipment_id shipper_id courier_id  Question                                sender        shipper_replied
0   14      9962    228898  Let's get your furbabys home Apple pet transpo...   courier       False
1   91919   190872  196838  Hi I'm kevin thims and I'm happy to do the job...   courier       False
2   92187   191128  196838  Hi I'm kevin thims and I'm happy to do the job...   shipper       True

【问题讨论】:

  • 你能在问题中添加预期的输出吗?

标签: pandas pandas-groupby pandas-apply


【解决方案1】:

相信你需要GroupBy.transform:

df['shipper_replied'] = (df.groupby(unique_thread_indentifier)['sender']
                           .transform(lambda group: 'shipper' in group.unique()))

print (df)
   shipment_id  shipper_id  courier_id  \
0           14        9962      228898   
1        91919      190872      196838   
2        92187      191128      196838   

                                          Question   sender  shipper_replied  
0  Let's get your furbabys home Apple pet transpo.  courier            False  
1   Hi I'm kevin thims and I'm happy to do the job  courier            False  
2   Hi I'm kevin thims and I'm happy to do the job  shipper             True  

另一种解决方案:

df['shipper_replied'] = (df.assign(new = df['sender'].eq('shipper'))
                           .groupby(unique_thread_indentifier)['new']
                           .transform('any'))

print (df)
   shipment_id  shipper_id  courier_id  \
0           14        9962      228898   
1        91919      190872      196838   
2        92187      191128      196838   

                                          Question   sender  shipper_replied  
0  Let's get your furbabys home Apple pet transpo.  courier            False  
1   Hi I'm kevin thims and I'm happy to do the job  courier            False  
2   Hi I'm kevin thims and I'm happy to do the job  shipper             True  

【讨论】:

  • 这不是我想要的 - 我希望将列 Question 包含在预期输出中的结果数据框中
  • @homeStayProg - 您现在可以查看吗?
猜你喜欢
  • 2018-02-09
  • 2018-10-23
  • 2019-11-05
  • 2020-04-02
  • 2018-03-05
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
相关资源
最近更新 更多