gpt4 book ai didi

python - Pandas:以一列的子字符串搜索和另一列的逆搜索为条件创建一个新列

转载 作者:行者123 更新时间:2023-12-04 03:47:47 24 4
gpt4 key购买 nike

我想基于对一列的子字符串搜索和另一列的反向搜索在 Pandas 数据框中创建一个新列。这是一些数据:

import pandas as pd
import numpy as np

df = pd.DataFrame({'Manufacturer':['ABC-001', 'ABC-002', 'ABC-003', 'ABC-004', 'DEF-123', 'DEF-124', 'DEF-125', 'ABC-987', 'ABC-986', 'ABC-985'],
'Color':['04-Red', 'vs Red - 07', 'Red', 'Red--321', np.nan, np.nan, np.nan, 'Blue', 'Black', 'Orange'],
})


Manufacturer Color
0 ABC-001 04-Red
1 ABC-002 vs Red - 07
2 ABC-003 Red
3 ABC-004 Red--321
4 DEF-123 NaN
5 DEF-124 NaN
6 DEF-125 NaN
7 ABC-987 Blue
8 ABC-986 Black
9 ABC-985 Orange
我希望能够创建一个名为 Country 的新列基于以下逻辑:
a) 如果 Manufacturer列包含子字符串 'ABC' 和 Color列包含子字符串“红色”,然后将“美国”写入 Country柱子
b) 如果 Manufacturer列包含子字符串“DEF”,然后将“加拿大”写入 Country柱子
c) 如果 Manufacturer列包含子字符串 'ABC' 和 Color列确实 不是 包含子字符串 'Red',然后将 'England' 写入 Country柱子。
我的尝试如下:
df['Country'] = np.where((df['Manufacturer'].str.contains('ABC')) & (df['Color'].str.contains('Red', na=False)), 'United States',  # the 'a' case
np.where(df['Manufacturer'].str.contains('DEF', na=False), 'Canada', # the 'b' case
np.where((df['Manufacturer'].str.contains('ABC')) & (df[~df['Color'].str.contains('Red', na=False)]), 'England', # the 'c' case
'ERROR')))
但是,这会出现以下错误:
TypeError: Cannot perform 'rand_' with a dtyped [float64] array and scalar of type [bool]
错误消息表明这可能是运算符优先级的问题,如中所述:
pandas comparison raises TypeError: cannot compare a dtyped [float64] array with a scalar of type [bool]
Python error: TypeError: cannot compare a dtyped [float64] array with a scalar of type [bool]
我相信我在这里正确使用了括号(尽管我可能不是)。
有没有人看到这个错误的原因? (或者知道一个更优雅的想要完成这个?)
提前致谢!

最佳答案

您不想索引到 df在这里,请执行以下操作:
只需更改:(df[~df['Color'].str.contains('Red', na=False)])至:~df['Color'].str.contains('Red', na=False)它应该工作。
另外,如果您想将其分解以提高可读性并消除一些重复,我会建议如下:

# define the parameters that define the Country variable in another table
df_countries = pd.DataFrame(
{'letters': ['ABC', 'DEF', 'ABC'],
'is_red': [True, False, False],
'Country': ['United States', 'Canada', 'England']})

# add those identifying parameters to your current table as temporary columns
df['letters'] = df.Manufacturer.str.replace('-.*', '')
df['is_red'] = df.Color.str.contains('Red', na=False)

# merge the tables together and drop the temporary key columns
df = df.merge(df_countries, how='left', on=['letters', 'is_red'])
df = df.drop(columns=['letters', 'is_red'])
或者更简洁:
in_col = lambda col, string: df[col].str.contains(string, na=False)

conds = {'United States': in_col('Manufacturer', 'ABC') & in_col('Color', 'Red'),
'Canada': in_col('Manufacturer', 'DEF'),
'England': in_col('Manufacturer', 'ABC') & ~in_col('Color', 'Red')}

df['Country'] = np.select(condlist=conds.values(), choicelist=conds.keys())

关于python - Pandas:以一列的子字符串搜索和另一列的逆搜索为条件创建一个新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64884355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com