我正在尝试创建一个新的列'newtype'基于以下规则:
- 查找'id'中'skill' = 'bill'的最后一条记录
- 然后创建新列:在上面步骤中找到的技能的"类型"是整个组的新类型。
例如,输入数据:
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
谁能告诉我如何达到上述结果?谢谢你! !
假设您所指的'group'由具有相同'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将每行传递给一个函数,该函数过滤df中具有相同id(属于同一组)的行,然后查找该组中'bill'技能的最后匹配的'type'值并返回该值以填充'newtype'。