python - 在 Pandas 中,如何用数据帧的另一个子集替换数据帧的一个子集?

标签 python pandas dataframe replace

假设我有一个数据框,其中每 5 行都填充 NA,如下所示:

<表类=“s-表”> <标题> 数量 一个 B C <正文> 4 2 1 0 5 不适用 不适用 不适用 6 5 6 7 100 3 5 2

我想将第 5 行中找到的 NA 值替换为第 3 行中的值。

到目前为止我已经尝试过:

df.loc[df['Number'] % 5 == 0, ['A','B','C']] = df.loc[df['Number'] % 3 == 0, ['A','B','C']]

这种方法不会引发任何错误,但它什么也不做。但是,如果我用常量替换赋值的右侧,它就可以正常工作,如下所示:

df.loc[df['Number'] % 5 == 0, ['A','B','C']] = 3

知道如何让它发挥作用吗?

编辑:

我不想给出完整的原始任务,但是这个虚拟示例有点错误。因此,我们假设右侧的行数与左侧的行数相同。主要目标仍然是根据条件用数据帧的子集替换每 5 行的值。我希望它能更容易理解一点,对于错误,我们深表歉意。

最佳答案

您的索引未对齐,这就是它不起作用的原因:

# Left hand side
>>> df.loc[df['Number'] % 5 == 0, ['A','B','C']]
     A    B    C
1  NA   NA   NaN
3   3    5   2.0

# Right hand side
>>> df.loc[df['Number'] % 3 == 0, ['A','B','C']]
    A   B    C
2  5   6   7.0

Pandas 无法在 (1, 3) 和 2 之间对齐索引。解决方案是将右侧转换为 numpy 数组 .values.to_numpy() 。但是,如果您这样做,您也会更改第四行。

更新:

So let's assume that the right side has as many rows as the left side

在这种情况下,使用:

df.loc[df['Number'] % 5 == 0, ['A','B','C']] = \
    df.loc[df['Number'] % 3 == 0, ['A','B','C']].values
# Before (I slightly modified your example)
>>> df
   Number    A    B    C
0       3  2.0  1.0  0.0
1       5  NaN  NaN  NaN
2       6  5.0  6.0  7.0
3     100  NaN  NaN  NaN

# After
>>> df
   Number    A    B    C
0       3  2.0  1.0  0.0
1       5  2.0  1.0  0.0
2       6  5.0  6.0  7.0
3     100  5.0  6.0  7.0

关于python - 在 Pandas 中,如何用数据帧的另一个子集替换数据帧的一个子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76177107/

相关文章:

python - 如何让 Python shell 找到 matplotlib?

python - django .env 文件无法像教程所解释的那样工作

python - 如何将分类数据更改为二进制数据?

python-3.x - 在同一个 excel 工作表中,在 python 中一个一个地写多个数据框

python - 显示截止值的混淆矩阵

python - 错误 :cannot use a string pattern on a bytes-like object

python-3.x - 使用 openpyxl 从 excel 中读取列时精度丢失

python - 如何确保在 pd.merge 期间不会丢失任何行

r - 使用 "data.table"包合并数据帧时出错

python - resample/groupby 中的 Pandas 聚合列表