pandas dataframe 根据另一列的聚合过滤具有关键字的列
pandas dataframe filter a column with a key word based on the aggregation of another column
假设我有以下数据框 df:
Contract_Id, date, product, qty
1,2016-08-06,a,1
1,2016-08-06,b,2
1,2017-08-06,c,2
2,2016-08-06,a,1
3,2016-08-06,a,2
3,2017-08-06,a,2
4,2016-08-06,b,2
4,2017-09-06,a,2
我试图找出每个合同 ID 是否有产品 b 或产品 a 和 return 2 列。
理想输出:
Contract_Id, date, product, qty, contract_id_has_a, contract_id_has_b
1,2016-08-06,a,1,True,True
1,2016-08-06,b,2,True,True
2,2016-08-06,a,1,True,False
3,2016-08-06,a,2,True,False
4,2016-08-06,b,2,False,True
这只会return该行是否有产品a
df[‘product’].str.contains('a', flags=re.IGNORECASE, regex=True)
我试过了:
import re
df[‘product’].groupby([‘Contract_Id']).str.contains('a', flags=re.IGNORECASE, regex=True)
KeyError: ‘Contract_Id'
谁能指教一下?谢谢!
为了执行分组但最后所有原始行的 return 值(而不仅仅是每个组),您应该使用 pd.transform 函数。然后你可以检查是否有任何组匹配,并为所有行设置它。
这可行:
df['contract_id_has_a'] = df.groupby('Contract_Id')['product'].transform(lambda x: x.str.contains('a').any())
假设我有以下数据框 df:
Contract_Id, date, product, qty
1,2016-08-06,a,1
1,2016-08-06,b,2
1,2017-08-06,c,2
2,2016-08-06,a,1
3,2016-08-06,a,2
3,2017-08-06,a,2
4,2016-08-06,b,2
4,2017-09-06,a,2
我试图找出每个合同 ID 是否有产品 b 或产品 a 和 return 2 列。
理想输出:
Contract_Id, date, product, qty, contract_id_has_a, contract_id_has_b
1,2016-08-06,a,1,True,True
1,2016-08-06,b,2,True,True
2,2016-08-06,a,1,True,False
3,2016-08-06,a,2,True,False
4,2016-08-06,b,2,False,True
这只会return该行是否有产品a
df[‘product’].str.contains('a', flags=re.IGNORECASE, regex=True)
我试过了:
import re
df[‘product’].groupby([‘Contract_Id']).str.contains('a', flags=re.IGNORECASE, regex=True)
KeyError: ‘Contract_Id'
谁能指教一下?谢谢!
为了执行分组但最后所有原始行的 return 值(而不仅仅是每个组),您应该使用 pd.transform 函数。然后你可以检查是否有任何组匹配,并为所有行设置它。
这可行:
df['contract_id_has_a'] = df.groupby('Contract_Id')['product'].transform(lambda x: x.str.contains('a').any())