为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas 如何将两行与复杂的规则/条件组合在一起

Pandas 如何将两行与复杂的规则/条件组合在一起

桃花长相依 2023-07-11 16:20:38
我有一个数据框:import pandas as pddf = pd.DataFrame({    "ID": ['company A', 'company A', 'company A', 'company B','company B', 'company B', 'company C', 'company C','company C','company C', 'company D', 'company D','company D'],    'Sender': [28, 'remove1', 'flag_source', 56, 28, 312, 'remove2', 'flag_source', 78, 102, 26, 101, 96],    'Receiver': [129, 28, 'remove1', 172, 56, 28, 61, 'remove2', 12, 78, 98, 26, 101],    'Date': ['2020-04-12', '2020-03-20', '2020-03-20', '2019-02-11', '2019-01-31', '2018-04-02', '2020-06-29', '2020-06-29', '2019-11-29', '2019-10-01', '2020-04-03', '2020-01-30', '2019-10-18'],    'Sender_type': ['house', 'temp', 'house', 'house', 'house', 'house', 'temp', 'house', 'house','house','house', 'temp', 'house'],    'Receiver_type': ['house', 'house', 'temp', 'house','house','house','house', 'temp', 'house','house','house','house','temp'],    'Price': [32, 50, 47, 21, 23, 19, 52, 39, 12, 22, 61, 53, 19]})我希望通过以下规则合并/合并每个组“ID”(公司 x)的两行:将“Sender”中包含“flag_source”的行及其上面的行合并为一个新行。在这个新行中:Sender 是 flag_source,'Revceiver' 是其上面的值(删除两个 'remove' 值),Date 是上面的日期,Sender_type 和 Receiver_type 是 'house','Price' 是上面的上一个值价值。然后删除两行。例如,对于 A 公司,它将合并第 1 行和第 2 行以生成以下新行:希望我对这个问题的解释是清楚的。由于这是一个简短的示例,实际案例有很多这样的数据,我写了一个循环,但非常慢且效率低下,所以如果您有任何想法和有效的方法,请帮助。非常感谢您的帮助!
查看完整描述

1 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

我相信以下方法正在发挥作用:


mask = df.Sender == 'flag_source'

df[mask] = df.shift()

df.loc[mask, 'Sender'] = 'flag_source'

df.loc[mask, ['Sender_type','Receiver_type']] = 'house'

df = df[~mask.shift(-1).fillna(False).astype(bool)].reset_index(drop=True)

所以步骤是(按行):

  • 制作您需要更改的行的掩码

  • 使用“shift”将这些行设置为等于前一行

  • 将这些行重写Senderflag_source

  • 还重写Sender_typeReceiver_type

  • shift通过在蒙版上再次使用 a 来删除前面的行。这看起来有点复杂;loc您还可以对不包含字符串的行执行类似的操作remove

输出:

          ID       Sender Receiver        Date Sender_type Receiver_type  Price

0   company A           28      129  2020-04-12       house         house   32.0

1   company A  flag_source       28  2020-03-20       house         house   50.0

2   company B           56      172  2019-02-11       house         house   21.0

3   company B           28       56  2019-01-31       house         house   23.0

4   company B          312       28  2018-04-02       house         house   19.0

5   company C  flag_source       61  2020-06-29       house         house   52.0

6   company C           78       12  2019-11-29       house         house   12.0

7   company C          102       78  2019-10-01       house         house   22.0

8   company D           26       98  2020-04-03       house         house   61.0

9   company D          101       26  2020-01-30        temp         house   53.0

10  company D           96      101  2019-10-18       house          temp   19.0


查看完整回答
反对 回复 2023-07-11
  • 1 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信