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

我有一个数据框:


import pandas as pd


df = 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 行以生成以下新行:

希望我对这个问题的解释是清楚的。


由于这是一个简短的示例,实际案例有很多这样的数据,我写了一个循环,但非常慢且效率低下,所以如果您有任何想法和有效的方法,请帮助。非常感谢您的帮助!


桃花长相依
浏览 146回答 1
1回答

互换的青春

我相信以下方法正在发挥作用: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”将这些行设置为等于前一行将这些行重写Sender为flag_source还重写Sender_type和Receiver_typeshift通过在蒙版上再次使用 a 来删除前面的行。这看起来有点复杂;loc您还可以对不包含字符串的行执行类似的操作remove输出:          ID       Sender Receiver        Date Sender_type Receiver_type  Price0   company A           28      129  2020-04-12       house         house   32.01   company A  flag_source       28  2020-03-20       house         house   50.02   company B           56      172  2019-02-11       house         house   21.03   company B           28       56  2019-01-31       house         house   23.04   company B          312       28  2018-04-02       house         house   19.05   company C  flag_source       61  2020-06-29       house         house   52.06   company C           78       12  2019-11-29       house         house   12.07   company C          102       78  2019-10-01       house         house   22.08   company D           26       98  2020-04-03       house         house   61.09   company D          101       26  2020-01-30        temp         house   53.010  company D           96      101  2019-10-18       house          temp   19.0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python