python - 熊猫匹配两列并创建另一列
问题描述
我有一个包含 A 、B 、C 列的数据框。我想比较 B 和 C 列并创建两列 A-1(当前行年份 -1)和 A-2(当前行年份 -2),其中 A 是年列。
示例:在 1971 年的数据框中,B 列有苹果、橙子,C 列只有苹果,1970 年有 B-香蕉、苹果和 C-苹果。现在,对于 1971 年的每一行,我们尝试为 A-1(1970)、A-2(1969) 列生成值。在 (A-1)1970 年,苹果在 B、C 列中都被捕获,所以我们1971 年的前两行标记是,然后第三行标记为否,因为 1970 年没有橙色。
因此,对于每一行,我们都会考虑年份(比如 1971 年)并检查 B 和 C 值,并查看该特定 B 值是否也在 year-1(1970) 和 year-2(1969 的 C 列中捕获,在这种情况下它将是 nan,因为我们的数据框中没有 1969 的任何记录)并相应地标记它们。
数据框:
A B C D
1971 apple apple yes
1971 apple apple yes
1971 orange nan no
1970 banana nan no
1970 apple apple yes
1972 mango mango yes
1972 banana banana yes
1972 orange orange yes
1972 apple apple yes
1973 banana nan no
1973 mango mango yes
1973 apple nan no
1974 orange nan no
输出:
A B C A-1 A-2
1971 apple apple yes nan
1971 apple apple yes nan
1971 orange nan no nan
1970 banana nan nan nan
1970 apple apple nan nan
1972 mango mango no no
1972 banana banana no no
1972 orange orange no no
1972 apple apple no no
1973 banana nan yes no
1973 mango mango yes no
1973 apple nan yes yes
1974 orange nan no yes
我想不通,请帮助我。
解决方案
df = pd.DataFrame(
{'A': [1971,1971,1971,1970,1970,1972,1972,1972,1972,1973,1973,1973,1974],
'B': ['apple', 'apple', 'orange', 'banana', 'apple', 'mango', 'banana', 'orange', 'apple', 'banana', 'mango', 'apple', 'orange'],
'C': ['apple', 'apple', 'nan', 'nan', 'apple', 'mango', 'banana', 'orange', 'apple', 'nan', 'mango', 'nan', 'nan'],
})
fruits_by_year = df[df.C!='nan'].groupby('A')['C'].apply(set).to_dict()
def get_A_minus_n(x, n):
if x.A-n not in fruits_by_year:
return 'nan'
elif x.B in fruits_by_year[x.A-n]:
return 'yes'
else:
return 'no'
df['A-1'] = df.apply(lambda x: get_A_minus_n(x, 1), axis=1)
df['A-2'] = df.apply(lambda x: get_A_minus_n(x, 2), axis=1)
让我们首先构建一个名为 的字典fruits_by_year
:
丢弃其
'C'
为的行'nan'
按列分组
'A'
并在列中获取它们的值'C'
将值转换为集合
将整个结果转换为字典
它应该是:
{1970:{'apple'},1971:{'apple'},1972:{'apple','banana','mango','orange'},1973:{'mango'}}
然后建立两个新列。我们要:
构建一个
get_A_minus_n
在 3 种不同情况下返回不同值的函数将该函数应用于 DataFrame 的每一行
注意:第 9 行的'A-1'
,'A-2'
应该是'yes'
,'yes'
推荐阅读
- google-bigquery - 如何查询只能通过另一个查询获得名称的表
- notion-api - SyntaxError:请求的模块“@notionhq/client”未提供名为“Client”的导出
- spring - 使用 APPROLE 拉取方法与 Spring Boot 进行 Vault 集成
- spring - 如何区分 Spring Messaging 中的目标以进行套接字交换
- phalcon - Phalcon 控制器 $this->session 和 Phalcon\Session\Manager()
- django - Django 插入 OTP 代码以在网站上显示 div
- laravel - 我正在尝试在 cPanel 上运行任务计划但不工作
- kotlin - javax.validation/hibernate-validator 无法使用 Kotlin 验证嵌套字段
- javascript - 如何使用 webpack-merge 设置不同的插件选项
- svg - imagick没有检测到inkscape