简单地把它煮沸...
数据框 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/