0

我正在尝试根据以下规则创建一个新列“newtype”:

  1. 在具有 'skill' = 'bill' 的 'id' 中找到最后一条记录
  2. 然后新建列:上一步中找到的技能的“类型”是整个组的新类型。

例如,输入数据:

df = pd.DataFrame({"id": [1, 1, 1, 2,2,3,3,3,4],
"skill": ['cc', 'bill', 'cc', 'cc','bill','a','bill','bill','bill'],
 "type": ['a', 'a', 'b', 'b','a','a','a','b','a']})
df

我想要的结果:

df = pd.DataFrame(
{"id": [1, 1, 1, 2,2,3,3,3,4],
 "skill": ['cc', 'bill', 'cc', 'cc','bill','a','bill','bill','bill'],
 "type": ['a', 'a', 'b', 'b','a','a','a','b','a'],
 "newtype": ['a', 'a', 'a', 'a','a','b','b','b','a']})
df

谁能告诉我如何实现上述结果?谢谢!!!

4

1 回答 1

1

假设您所指的“组”由具有相同“id”值的行组成,这是一个解决方案:

import pandas as pd

df = pd.DataFrame({"id": [1, 1, 1, 2,2,3,3,3,4],
"skill": ['cc', 'bill', 'cc', 'cc','bill','a','bill','bill','bill'],
 "type": ['a', 'a', 'b', 'b','a','a','a','b','a']})

def get_type(row):
    df_temp = df[df['id'] == row['id'] ]
    return df_temp[df_temp['skill'].str.contains('bill')].iloc[-1]['type']
 
df['newtype'] = df.apply(lambda row:get_type(row), axis=1)

输出:

|    |   id | skill   | type   | newtype   |
|---:|-----:|:--------|:-------|:----------|
|  0 |    1 | cc      | a      | a         |
|  1 |    1 | bill    | a      | a         |
|  2 |    1 | cc      | b      | a         |
|  3 |    2 | cc      | b      | a         |
|  4 |    2 | bill    | a      | a         |
|  5 |    3 | a       | a      | b         |
|  6 |    3 | bill    | a      | b         |
|  7 |    3 | bill    | b      | b         |
|  8 |    4 | bill    | a      | a         |

通过 df.apply,每一行都通过一个函数,该函数为具有相同 id(属于同一组)的行过滤 df,然后查找该组中“bill”技能的最后一次匹配的“type”值并返回该值以填充“newtype”。

于 2021-01-29T19:41:04.127 回答