pandas:在每行Datafram上应用函数

2024-04-29 03:13:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据帧,包含3列:

|  val1  |  val2  |  val3  | 
|--------------------------|
|  Nike  |  NaN   |  NaN   |  
|  Men   | Adidas |  NaN   |  
| Puma   |  Red   |  Women | 

和3个列表:

^{pr2}$

我尝试对每一行应用一个函数,根据函数返回的布尔值检查并将每个值放入新列中。在

|  val1  |  val2  |  val3  | brand | gender | color
|----------------------------------------------------
|  Nike  |  NaN   |  NaN   |  Nike  |  NaN   | NaN
|  Men   | Adidas |  NaN   | Adidas |  Men   | NaN
|  Puma  |  Red   |  Women | Puma   |  Women | Red   

我使用列表来说明我的问题,但是在我的脚本中,我使用enchant库来检查字典中是否存在一个值。在

我已经试过了:

ref_brands = enchant.request_pwl_dict("ref_brands.txt")
brands_checker = SpellChecker(ref_brands)

print brands_checker.check('Puma')
> True
print brands_checker.check('Men')
> False

[pyenchant tutorial][1]

def my_cust_check(x, checker):
    l = x.tolist()
    for e in iter(l):
        try:
             if checker.check(e.strip().encode('utf-8')) is True:
                return e.strip()
             else:
                return None
        except:
             return None

df_query_split['brand'] = df_query_split.apply(my_cust_check,checker=brand_checker, axis=1)
df_query_split['gender'] = df_query_split.apply(my_cust_check,checker=gender_checker, axis=1)
df_query_split['color'] = df_query_split.apply(my_cust_check,checker=color_checker, axis=1)

Tags: dfmycheckcheckerrednanquerysplit
1条回答
网友
1楼 · 发布于 2024-04-29 03:13:48

您可以使用:

df['brand'] = df[df.isin(Brands)].ffill(axis=1).iloc[:, -1]
df['gender'] = df[df.isin(Gender)].ffill(axis=1).iloc[:, -1]
df['color'] = df[df.isin(Color)].ffill(axis=1).iloc[:, -1]
print (df)
   val1    val2   val3   brand gender color
0  Nike     NaN    NaN    Nike    NaN   NaN
1   Men  Adidas    NaN  Adidas    Men   NaN
2  Puma     Red  Women    Puma  Women   Red

详细信息:

首先按^{}比较:

^{pr2}$

提取Trues的值:

print (df[df.isin(Brands)])
   val1    val2 val3
0  Nike     NaN  NaN
1   NaN  Adidas  NaN
2  Puma     NaN  NaN

NaNs替换为^{},并使用前向填充(ffill):

print (df[df.isin(Brands)].ffill(axis=1))
   val1    val2    val3
0  Nike    Nike    Nike
1   NaN  Adidas  Adidas
2  Puma    Puma    Puma

^{}查看最后一列:

print (df[df.isin(Brands)].ffill(1).iloc[:, -1])
0      Nike
1    Adidas
2      Puma
Name: val3, dtype: object

相关问题 更多 >