python - 数据框中的条件新列
问题描述
例如,我有一个数据框:
B1 B2 B3 B4 BCS ULCA MIMO
6 28A 1A 0 . 1A
7 28A 1A 1 . 1A
8 3A 1A 0 . 1A
9 3A 1A 1 . 1A
10 3A 1A 0 . 3A
11 3A 1A 1 . 3A
12 3A 1A 0 . 1A-3A
13 3A 1A 1 . 1A-3A
我np.where
习惯将条件作为新列:如果 B1-B4 的值等于 MIMO,则放入4
新列,如果不是,则放入2
b['B1_m'] = np.where(b['B1'] == b['MIMO'], '4', '2')
b['B2_m'] = np.where(b['B2'] == b['MIMO'], '4', '2')
b['B3_m'] = np.where(b['B3'] == b['MIMO'], '4', '2')
b['B4_m'] = np.where(b['B4'] == b['MIMO'], '4', '2')
但我的输出在某些行(第 10、11 行)有一些错误:
B1 B2 B3 B4 BCS ULCA MIMO B1_m B2_m B3_m B4_m
6 28A 1A 0 . 1A 2 4 2 2
7 28A 1A 1 . 1A 2 4 2 2
8 3A 1A 0 . 1A 2 4 2 2
9 3A 1A 1 . 1A 2 4 2 2
10 3A 1A 0 . 3A 2 2 2 2
11 3A 1A 1 . 3A 2 2 2 2
12 3A 1A 0 . 1A-3A 2 2 2 2
13 3A 1A 1 . 1A-3A 2 2 2 2
有什么提示吗?
更新
d = b.loc[9:12, ['B1','MIMO']].to_dict(orient='list')
print(d)
输出:
{'B1': ['3A', '3A', '3A', '3A'], 'MIMO': ['1A', ' 3A', ' 3A', ' 1A-3A']}
解决方案
有必要通过以下方式删除跟踪空格str.strip
:
b['MIMO'] = b['MIMO'].str.strip()
此外,您的解决方案应该重写为一个np.where
用于eq
比较:
cols = ['B1','B2','B3','B4']
arr = np.where(b[cols].eq(b['MIMO'], axis=0), '4','2')
#alternative
#arr = np.where(b[cols].values == b['MIMO'].values[:, None], '4','2')
b = b.join(pd.DataFrame(arr, columns=cols, index=b.index).add_suffix('_m'))
print (b)
B1 B2 B3 B4 BCS ULCA MIMO B1_m B2_m B3_m B4_m
6 28A 1A NaN NaN 0 . 1A 2 4 2 2
7 28A 1A NaN NaN 1 . 1A 2 4 2 2
8 3A 1A NaN NaN 0 . 1A 2 4 2 2
9 3A 1A NaN NaN 1 . 1A 2 4 2 2
10 3A 1A NaN NaN 0 . 3A 4 2 2 2
11 3A 1A NaN NaN 1 . 3A 4 2 2 2
12 3A 1A NaN NaN 0 . 1A-3A 2 2 2 2
13 3A 1A NaN NaN 1 . 1A-3A 2 2 2 2
推荐阅读
- python - 为数据库创建抽象层作为 Web API 的输入
- c# - C# forms exe 检测为病毒
- python-3.x - 在 Matplotlib 中使用月份名称(例如一月)绘制时间序列并在下面显示年份
- android - 如何将通用 Gradle 脚本转换为 Gradle Kotlin DSL?
- java - 不可见时以空名称在模式中列出
- java - 如何从业务中心 (Java) 使用 Web 服务?(解决了)
- python - 使用python 3 turtle onscreenclick方法无法返回值
- linux - 如何在每次执行命令后多次运行脚本以等待设备准备好再次执行?
- c - C中的volatile关键字,是否所有变量都标记为volatile?
- node.js - Azure CDN 是否有助于提高 Microsoft bot 框架与 Twilio Adapter 一起使用的性能