在Pandas中,我如何用 Dataframe 的另一个子集替换 Dataframe 的一个子集?

pepwfjgg  于 2023-05-05  发布在  其他
关注(0)|答案(2)|浏览(225)

假设我有一个dataframe,其中每第5行填充NA,如下所示:
| 数量|一个|B|C类|
| --------------|--------------|--------------|--------------|
| 四|二|1|0|
| 五|不适用|不适用|不适用|
| 六|五|六|七|
| 一百|三|五|二|
我想用第3行的值替换第5行的NA值。
到目前为止我尝试过的:

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

有什么办法吗?
编辑:
我不想给予完整的原始任务,但是这个虚拟的例子有点错误。因此,让我们假设右侧的行数与左侧的行数相同。主要目标仍然是基于条件用 Dataframe 的子集替换每第五行的值。我希望这是一个更容易理解的一点,并为miscralification道歉。

y3bcpkx1

y3bcpkx11#

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Number': [3, 5, 6, 100],
    'B': [2, np.nan, 5, 3],
    'C': [1, np.nan, 6, 5],
    'D': [0, np.nan, 7, 2]
}).set_index('Number')

idx = df[df.isna().all(axis=1)].index
df.loc[idx] = df.loc[idx - 2].values
osh3o9ms

osh3o9ms2#

你的索引不对齐,这就是它不工作的原因:

# 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()。但是,如果您这样做,您也会更改第四行。
更新:
所以让我们假设右侧的行数和左侧一样多
在这种情况下,用途:

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

相关问题