给定一个示例数据帧df,当按'ind'分组时,如果'Hat'在组中,我想将组中的值设置为'Hat'。即
ind | val ind | val
---------- ---------
1 | Hat 1 | Hat
1 | Cat 1 | Hat
1 | Cat - > 1 | Hat
2 | Dog 2 | Dog
2 | Log 2 | Log
3 | Hat 3 | Hat
3 | Hat 3 | Hat
我有以下代码告诉我'帽子'是否在一个组中,但是最好的方法是将该组中的每个值设置为帽子?
for i, x in df.groupby('ind'):
if(x['val'].str.contains('Hat').any()):
答案 0 :(得分:2)
没有groupby
或lambda
的一种方法是使用pd.DataFrame.loc
:
import pandas as pd
df = pd.DataFrame({'ind': [1, 1, 1, 2, 2, 3, 3],
'val': ['Hat', 'Cat', 'Cat', 'Dog', 'Log', 'Hat', 'Hat']})
idx = set(df.loc[df['val'].str.contains('Hat', regex=False), 'ind'])
df.loc[df['ind'].isin(idx), 'val'] = 'Hat'
ind val
0 1 Hat
1 1 Hat
2 1 Hat
3 2 Dog
4 2 Log
5 3 Hat
6 3 Hat
答案 1 :(得分:1)
In [101]: (df.groupby('ind')['val']
.transform(lambda x: ['Hat'] * len(x) if x.str.contains('Hat').any() else x))
Out[101]:
0 Hat
1 Hat
2 Hat
3 Dog
4 Log
5 Hat
6 Hat
Name: val, dtype: object
答案 2 :(得分:1)
我会做什么
df.loc[df.val.eq('Hat').groupby(df.ind).transform('any'),'val']='Hat'
df
ind val
0 1 Hat
1 1 Hat
2 1 Hat
3 2 Dog
4 2 Log
5 3 Hat
6 3 Hat
答案 3 :(得分:0)
简单
df.groupby("ind").transform(lambda k: "hat" if "hat" in k.values else k.values)