gpt4 book ai didi

python-3.x - 使用 np.where 或 loc 更新 pandas 数据框的多列

转载 作者:行者123 更新时间:2023-12-05 01:13:48 26 4
gpt4 key购买 nike

我们有一个数据框:

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
-------------------

对于 CD 列,它们都将被填充或都为 NaN(不会出现 C 的情况NaN 并且 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

我已经研究过这个问题 here ,并尝试了一些方法将 df[['C', 'D']] 转换为列表并将其作为新的数据帧分配回来,但我仍然无法使其工作。

我知道我可以单独分配列(A-C、B-D),但我正在处理大量这样的对,并希望避免遍历它们。是否有一种干净的方法可以一次完成此操作?

使用 pandas 版本 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

关于python-3.x - 使用 np.where 或 loc 更新 pandas 数据框的多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59700460/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com