现有Df1、df2,df1拥有A、B两列,df1新建第三列,进行判断:若A、B同时满足存在于df2内,则C列写入"买卖",如果只有A存在于df2内,则C写入"买",如果只有B存在于df2内,则C写入"卖",如果A和B都不存在于df2内,则C写入"空"
时间: 2024-09-24 08:13:16 浏览: 37
在Python的pandas库中,你可以通过以下步骤来实现这个逻辑:
```python
import pandas as pd
# 假设df1和df2已经定义好
df1 = ... # df1的数据
df2 = ... # df2的数据
# 新建一个全0的df1副本,并添加C列
df1_copy = df1.copy()
df1_copy['C'] = ''
# 使用条件布尔索引来填充C列
df1_copy.loc[(df1_copy['A'].isin(df2['A']) & df1_copy['B'].isin(df2['B'])), 'C'] = '买卖'
df1_copy.loc[df1_copy['A'].isin(df2['A']), 'C'] = '买'
df1_copy.loc[df1_copy['B'].isin(df2['B']), 'C'] = '卖'
# 对于既不在df2['A']也不在df2['B']中的行,将C列设置为'空'
df1_copy.loc[~((df1_copy['A'].isin(df2['A'])) | (df1_copy['B'].isin(df2['B']))), 'C'] = '空'
df1_copy
```
在这个例子中,我们首先创建了df1的一个副本df1_copy,然后使用`isin()`函数检查每个元素是否在df2的对应列中存在。最后,我们使用布尔索引来决定如何填写'C'列。
相关问题
现有Df1、df2,df1拥有A、B两列,df2只有两列数据,df1新建第三列,进行判断:若A、B同时满足存在于df2内,则C列写入"买卖",如果只有A存在于df2内,则C写入"买",如果只有B存在于df2内,则C写入"卖",如果A和B都不存在于df2内,则C写入"空"
在Python的Pandas库中,你可以使用条件布尔索引来实现这样的操作。首先,你需要创建一个笛卡尔积(Cartesian product)来检查每个组合(A, B)是否都在df2中,然后根据结果填充df1的新列C。以下是具体的步骤:
```python
import pandas as pd
# 假设 df1 和 df2 是 DataFrame 的实例
df1 = pd.DataFrame({'A': df1['A'].tolist(), 'B': df1['B'].tolist()})
df2 = pd.DataFrame({'Column1': df2['Column1'].tolist(), 'Column2': df2['Column2'].tolist()})
# 创建笛卡尔积
combined_df = pd.merge(df1, df2, how='outer', indicator=True)
# 根据合并结果填写新列C
combined_df['C'] = np.select(
[
(combined_df['_merge'] == 'both'), # A和B同时存在
(combined_df['_merge'] == 'left_only') & (combined_df['Column1'].notna()), # 只有A存在
(combined_df['_merge'] == 'right_only') & (combined_df['Column2'].notna()), # 只有B存在
(combined_df['_merge'] == 'none') # A和B都不存在
],
['买卖', '买', '卖', '空'],
default='空'
)
# 将结果回填到原始df1
df1['C'] = combined_df[df1.index]['C']
# 删除临时用于合并的 '_merge' 列
df1.drop('_merge', axis=1, inplace=True)
```
在这个例子中,`np.select`函数根据不同的条件选择相应的字符串并填充到新列C中。最后别忘了删除临时添加的 `_merge` 列。
df1拥有A、B两列,df1的C列数值为多条件求和,为同时满足df2中D等于A1、E等于B1的行对应的F列数值之和
要计算df1的C列,根据多个条件从df2中获取对应行的F列数值,并求和,可以使用以下代码:
```python
df1['C'] = df1.apply(lambda row: df2[(df2['D'] == row['A']) & (df2['E'] == row['B'])]['F'].sum(), axis=1)
```
这将使用`apply()`函数来对df1的每一行进行操作。对于每一行,`lambda`函数将根据条件`(df2['D'] == row['A']) & (df2['E'] == row['B'])`从df2中筛选出满足条件的行,并获取相应的F列数值。然后,`sum()`函数计算这些数值的总和,并将结果赋值给df1的C列。
请注意,上述代码中假设df1和df2具有相同的索引结构,即相应行的A和B值是匹配的。如果索引结构不匹配,您可能需要进行一些预处理操作,例如重新索引或合并数据框,以确保能够正确匹配条件。
阅读全文