Как мы можем заменить значения столбцов одного кадра данных на основе другого столбца данных, используя некоторые условия? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть два фрейма данных, скажем, df1 и df2, оба из этих фреймов очень большие, имеют более 1 миллиона строк и 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, затем замените эти значения на значения Col X, соответствующие этому индексу.</p>

Elif столбцы в df2> = 1.5 и <= 2 затем заменяют эти значения на значения Col Y, соответствующие этому индексу </p>

Ожидаемый результат:

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

Я пробовал этоway:

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

Иногда это работает, иногда нет (для первого случая), но этот метод очень медленный.У меня очень большой файл.

Пожалуйста, кто-нибудь может сказать мне любой эффективный способ сделать это.Заранее благодарен.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Если в обоих фреймах данных имеется одинаковый индекс, используйте 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
0 голосов
/ 12 февраля 2019

Возможно, это замедление, но это дает желаемый результат:

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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...