python - Pandas - Fillna 或 where 基于条件的函数
问题描述
我需要创建一个新列indicator
,其值为code
. 我不能使用 if else 语句,因为code
在列中的其他地方可以有一个值和相同的值second code
。任何帮助,将不胜感激。
import pandas as pd
df = pd.DataFrame({
'date': ['2019-04-19','2019-04-20','2019-05-03', '2019-05-04',
'2019-10-01','2019-10-07','2019-10-11', '2019-11-20'],
'category': ['ID F', 'ID F', 'ID F', 'ID F',
'ID B', 'ID B', 'ID B', 'ID B'],
'code': ['None', 'None', 'None', '8008',
'None', 'None', '9001', 'None'],
'second_code': ['None', 'None', '8008', 'None',
'None', 'None', 'None', 'None']})
df['date'] = pd.to_datetime(df['date'], infer_datetime_format=True)
date category code second_code
0 2019-04-19 ID F None None
1 2019-04-20 ID F None None
2 2019-05-03 ID F None 8008
3 2019-05-04 ID F 8008 None
4 2019-10-01 ID B None None
5 2019-10-07 ID B None None
6 2019-10-11 ID B 9001 None
7 2019-11-20 ID B None None
所需的数据框
date category code second_code indicator
0 2019-04-19 ID F None None None
1 2019-04-20 ID F None None None
2 2019-05-03 ID F None 8008 8008
3 2019-05-04 ID F 8008 None None
4 2019-10-01 ID B None None None
5 2019-10-07 ID B None None None
6 2019-10-11 ID B 9001 None 9001
7 2019-11-20 ID B None None None
编辑:
我努力了:
df['indicator'] = np.where(df['new_code'].notnull(), df['new_code'], np.where(df['code']).notnull(), df['code'], np.nan)
但我得到了错误 AttributeError: 'tuple' object has no attribute 'notna'
解决方案
最简单的方法应该是使用该fillna
函数和drop_duplicates
以确保我们第一次获得特定代码出现在列中。
# First we need to replace the "None" with actual NaN values
df = df.replace("None", np.nan)
df["indicator"] = df["second_code"].fillna(df["code"]).drop_duplicates()
df
date category code second_code indicator
0 2019-04-19 ID F NaN NaN NaN
1 2019-04-20 ID F NaN NaN NaN
2 2019-05-03 ID F NaN 8008 8008
3 2019-05-04 ID F 8008 NaN NaN
4 2019-10-01 ID B NaN NaN NaN
5 2019-10-07 ID B NaN NaN NaN
6 2019-10-11 ID B 9001 NaN 9001
7 2019-11-20 ID B NaN NaN NaN
本质上,我是在告诉熊猫:取列“second_code”,并用“code”中的值填写“second_code”中的任何缺失值(NaN)。然后,从上述操作中删除任何潜在的重复条目,并将此结果分配给“指标”列。
推荐阅读
- javascript - 在设定的时区中查找两个日期之间的差异
- ios - 如何使数组包含PDF文档
- javascript - 将地图转换为对象列表
- sql-server - 在 SQL Server 中显示按聚合条件过滤的月份
- swift - My UserDefaults values are always one-behind (Concurrency/Parallelism) in Swift
- python - 将 1 添加到列表的最后一个值
- html - 如何在 Google 的 Material Design 中更改顶部应用栏的填充颜色?
- java - 使用 LLVM 运行 javacpp 预设时出现 UnsatisfiedLinkError
- python - 如何自动重命名从 pytube 下载的文件?
- wordpress - Wordpress - 意外的令牌错误...预期的 LBRACE 和预期的 IDENT 错误