python-3.x - 使用 np.where 或 loc 更新 pandas 数据框的多列
问题描述
我们有一个数据框:
data = [['A1', 'B1'], ['A2', 'B2', 1, 2], ['A3', 'B3', 3, 4], ['A4', 'B4']]
df = pd.DataFrame(data, columns=['A','B','C','D'])
看起来像这样
A | B | C | D
-------------------
A1 | B1 | NaN | NaN
A2 | B2 | 1 | 2
A3 | B3 | 3 | 4
A4 | B4 | Nan | NaN
-------------------
对于列C
and D
,它们都将被填充或两者都被填充NaN
(不会出现C
isNaN
和D
将具有值的情况,反之亦然)
我的目标是将数据框转换为如下所示:
A | B | C | D
-------------------
A1 | B1 | NaN | NaN
1 | 2 | 1 | 2
3 | 4 | 3 | 4
A4 | B4 | Nan | NaN
-------------------
我试过了
df.loc[df['C'].notna(), ['A', 'B']] = df.loc[df['C'].notna(), ['C', 'D']]
# the above just assigns back NaN values instead of 1,2,3,4
和
m = df['C'].notna()
df[['A', 'B']] = np.where(m, df[['C', 'D']], df[['A', 'B']])
# the above errors with operands could not be broadcast together with shapes (4,) (4,2) (4,2)
df[['X', 'Y']] = pd.DataFrame(np.where(m, df[['C', 'D']]), df[['A', 'B']])
# the above errors with ValueError: either both or neither of X and Y should be given
我在这里查看了这个问题,并尝试了一些方法将其转换df[['C', 'D']]
为列表并将其分配回新的数据框,但我仍然无法使其工作。
我知道我可以单独分配列(AC、BD),但我正在处理大量这样的对,并希望避免循环遍历它们。有没有一种干净的方法可以一次性完成此操作?
使用熊猫版本 0.25.3。
谢谢您的帮助!
解决方案
使用pandas.loc[...]
:
df.loc[~df['C'].isna(), 'A']=df.loc[~df['C'].isna(), 'C']
df.loc[~df['D'].isna(), 'B']=df.loc[~df['D'].isna(), 'D']
使用np.where(...)
:
import numpy as np
df[['A', 'B']]=np.where(df['C'].notna().to_numpy().reshape(-1,1), df[['C', 'D']], df[['A', 'B']])
输出:
A B C D
0 A1 B1 NaN NaN
1 1 2 1.0 2.0
2 3 4 3.0 4.0
3 A4 B4 NaN NaN
推荐阅读
- c# - 计算文本框中的特定字母
- angular - 无法读取 MatTable 中未定义的属性“viewContainer”(角度材料表)
- pine-script - 目前在 input.resolution 之间切换,希望使用安全功能但无法解决
- apache-spark - 创建 pyspark 的 spark 上下文 py4j java gateway 对象
- javascript - VueJS google maps api不呈现自定义标记
- ajax - 文件传输后,有什么方法可以在本地主机和服务器上运行 Spring Boot 应用程序?
- java - 任何将 Webview 转换为位图图像而不显示 Webview 的方法
- reactjs - 外部控制图
- tcp - QUIC/HTTP3 在网络切换时是否受益于 udp?
- javascript - 试图将 span 附加到列表 appendchild(span) 中它会引发错误?