python - 尝试在一个数据框中创建一个 Pandas 系列,其值基于键是否在另一个数据框中

标签 python pandas dataframe series

简单地把它煮沸...

数据框 1 = yellow_fruits 列是水果名称和位置

数据框 2 = red_fruits 列是水果名称和位置

数据框 3 = fruit_montage 列是 fruit_name, pounds_of_fruit_needed, freshness

假设我想向 Dataframe 3 添加一个名为“color”的列。如果水果是黄色的,则该值为黄色,如果水果是红色的,则该值为红色,如果不是红色或黄色则未知。

基本上,伪代码...

如果水果在黄色水果数据框中,则黄色出现在列中 如果水果在红色水果数据框中,则红色进入该列 如果水果不在这两个数据框中,则列中会出现“未知”。

我的代码产生了一个错误:

 if df3['fruit_name'].isin(df1['fruit_name']):
        data = "'yellow"
    elif df3['fruit_name'].isin(df2['fruit_name']):
        data = "red"
    else:
        data = "unknown"

    df3['color'] = pd.Series(data, index = df3.index)

错误:

C:\Anaconda2\lib\site-packages\pandas\core\generic.pyc in nonzero(self) 第890章 攀上漂亮女局长之后891 --> 892 .format(self.class.name)) 893 894 bool = 非零

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

最佳答案

经典的方法是将您的条件用作索引器:

df1 = pd.DataFrame({'fruit_name':['banana', 'lemon']})
df2 = pd.DataFrame({'fruit_name':['strawberry', 'apple']})
df3 = pd.DataFrame({'fruit_name':['lemon', 'rockmelon', 'apple']})

df3["color"] = "unknown"
df3["color"][df3['fruit_name'].isin(df1['fruit_name'])] = "yellow"
df3["color"][df3['fruit_name'].isin(df2['fruit_name'])] = "red"
df3

#   fruit_name    color
# 0      lemon   yellow
# 1  rockmelon  unknown
# 2      apple      red

一种更实用的方法是将您的逻辑编写为函数并将其映射到您的系列中,但这可能会慢很多,因为 pandas/numpy 的很多速度来自使用矢量化操作:

def get_fruit_color(x):
    if x in df1['fruit_name'].unique():
        data = "yellow"
    elif x in df2['fruit_name'].unique():
        data = "red"
    else:
        data = "unknown"

    return data

df3["color"] = df3["fruit_name"].map(get_fruit_color)

一种受 SQL 启发的方法是将映射存储在数据框中,然后进行连接(在 pandas 中称为合并);这应该是一个非常高效的选择。指定 how='left' 意味着它将是一个左连接,因此如果没有找到连接条件的匹配项,该行仍将保留为空值:

colors = ([(x, 'yellow') for x in df1['fruit_name'].unique()] 
           + [(x, 'red') for x in df2['fruit_name'].unique()])
colors_df = pd.DataFrame(colors, columns = ['fruit_name', 'color'])
df3.merge(colors_df, how='left').fillna("unknown")

最后我最喜欢的方法(虽然可能有点“聪明”)是使用字典来映射你的值(这是一个特殊的 pandas 技巧),这将留下 NaN 如果没有找到匹配项,因此您可以用 fillna 填充它们:

df3["color"] = df3["fruit_name"].map(dict(colors)).fillna("unknown")

关于python - 尝试在一个数据框中创建一个 Pandas 系列,其值基于键是否在另一个数据框中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39715910/

相关文章:

python - 调用外部模块时多处理池变慢

python - Pandas 从日期时间戳中获取日期

pandas - 如何在由分区分隔的 map 上绘制散点图?

python - np.where 多个逻辑语句 pandas

python - 将 'curl -F' 转换为 Python 请求

python - 如何使用共享库组织和部署云函数项目?

python-2.7 - 从数据框中选择具有非零值的列

python - 如何使用 pandas 和 numpy 一起处理 Series 和 Array?

python - 使用 python pandas 处理包含嵌套 json 的列

Python读取二进制文件并解码