Python 我们如何使用某些条件替换基于不同数据帧列的一个数据帧的列值?

Python 我们如何使用某些条件替换基于不同数据帧列的一个数据帧的列值?,python,pandas,data-manipulation,data-cleaning,Python,Pandas,Data Manipulation,Data Cleaning,我有两个数据帧,比如说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.

我有两个数据帧,比如说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且<1.5,则用对应于该索引的X列值替换这些值

df2中的Elif列>=1.5和=0)和(df2[v]<1.5),v]=df1['ColX'] 有时这是可行的,有时不是(对于第一种情况),但这种方法非常缓慢。我有一个很大的文件

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

可能是要减速,但这会产生预期的结果:

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']
df2.1列中v的
:
正常=(df2[v]>=0)和(df2[v]<1.5)
df2.loc[ok,v]=df1.loc[ok,'ColX']
df2.loc[~ok,v]=df1.loc[~ok,'ColY']

可能会变慢,但这会产生预期的结果:

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']
df2.1列中v的
:
正常=(df2[v]>=0)和(df2[v]<1.5)
df2.loc[ok,v]=df1.loc[ok,'ColX']
df2.loc[~ok,v]=df1.loc[~ok,'ColY']

如果两个数据帧中有相同的索引,则通过广播与重复值一起使用:

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
arr=df2.0
m1=(arr>=0)和(arr<1.5)

m2=(arr>=1.2)和(arr如果两个数据帧中有相同的索引,则通过广播与重复值一起使用:

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
arr=df2.0
m1=(arr>=0)和(arr<1.5)

m2=(arr>=1.2)和(arr两个数据帧中有相同的索引值?两个数据帧中有相同的索引值?Thanx jezrael。这确实帮助了我,而且这是最快和有效的方法。我一直在寻找这个解决方案3-4天。我想问这一步意味着什么a1=df1['ColX']。值[:,无]。我可以说它正在以数组格式存储ColX的所有值,但下一步是什么[:,无]?这代表什么?@ShubhamRawlani-如果选中
print(a1)
print(a1.shape)
使用shape
(N,1)
,则与
[:,np.newaxis]相同
对于广播,请查看Thanx jezrael的最后一段。这确实帮助了我,而且这是最快、最有效的方法。我一直在寻找这个解决方案3-4天。我想问这一步意味着什么a1=df1['ColX']。值[:,无]。我可以说它正在以数组格式存储ColX的所有值,但下一步是什么[:,无]?这代表什么?@ShubhamRawlani-如果选中
print(a1)
print(a1.shape)
使用shape
(N,1)
,则与
[:,np.newaxis]相同
对于广播,请检查