【问题标题】:How can we replace the columns values of one dataframe based on different dataframe column using some conditions?我们如何使用某些条件根据不同的数据框列替换一个数据框的列值?
【发布时间】:2026-01-29 06:45:02
【问题描述】:

我有两个数据框,比如 df1 和 df2,这两个数据框都非常大,有 100 万行和 1000 列。 现在,df1 有一个列,比如 X,其中包含字符(如下所示)。而df2有900+列,每一列都需要根据df1进行更改。

df1:
Index   ColX ColY
 100     C    R
 101     T    Z
 102     A    Y
 ...    ..   ..

df2:
Index    ColA   ColB   ColC   ColD   ...  ...
 100     0.033  0.10   0.22   1.22   ...  ...
 101     1.77   1.34   0.45   1.90   ...  ...
 102     0.88   1.56   1.99   0.99   ...  ...
 ...     ...    ...    ...    ...    ...  ...

适用的条件是:

如果 df2 中的列 >= 0 且

df2 >= 1.5 和

预期输出:

df2:
Index    ColA   ColB   ColC   ColD   ...  ...
 100      C      C       C      C    ...  ...
 101      Z      T       T      Z    ...  ...
 102      A      Y       Y      A    ...  ...
 ...     ...    ...    ...    ...    ...  ...

我试过这样:

for v in df2.columns.tolist():
    df2 = df2.loc[(df2[v] >= 0) & (df2[v] < 1.5) , v] = df1['ColX']

有时这是有效的,有时不是(对于第一种情况),但这种方法非常慢。我有一个很大的文件。

请有人告诉我任何有效的方法来做到这一点。 提前致谢。

【问题讨论】:

  • 两个DataFrame中的索引值相同吗?

标签: python pandas data-manipulation data-cleaning


【解决方案1】:

如果两个 DataFrame 中的索引相同,则使用 numpy.select 通过广播重复值:

arr = df2.values
m1 = (arr >= 0) & (arr < 1.5)
m2 = (arr >= 1.2) & (arr <= 2)

a1 = df1['ColX'].values[:, None]
a2 = df1['ColY'].values[:, None]

df = pd.DataFrame(np.select([m1, m2], [a1, a2]), index=df2.index, columns=df2.columns)
print (df)
    ColA ColB ColC ColD
100    C    C    C    C
101    Z    T    T    Z
102    A    Y    Y    A

【讨论】:

  • 感谢耶兹瑞尔。这真的帮助了我,而且这是最快和有效的方法。我花了 3-4 天寻找这个解决方案。
  • 我想问这一步是什么意思a1 = df1['ColX'].values[:, None]。我可以说它以数组格式存储 ColX 的所有值,但下一步是什么 [:,None]?这代表什么?
  • @ShubhamRawlani - 如果检查print (a1)print (a1.shape) 得到一列array 形状为(N, 1),它与[:, np.newaxis] 相同,对于广播检查this 的最后一段
【解决方案2】:

也许它会变慢,但这会产生预期的结果:

for v in df2.columns:
    ok = (df2[v] >= 0) & (df2[v] < 1.5)
    df2.loc[ok, v] = df1.loc[ok, 'ColX']
    df2.loc[~ok, v] = df1.loc[~ok, 'ColY']

【讨论】: