Python: вычисление вычитания столбцов в датафрейме - PullRequest
0 голосов
/ 27 октября 2018

У меня есть фрейм данных, подобный этому:

   id_A  id_B  f1_A  f2_A  f3_A  f1_B  f2_B  f3_B  t
      1     2     1     2     3     4     5     6  1
      2     3     4     5     6     7     8     9  0
      3     4     7     8     9     8     7     6  1

Я хочу сделать вычитание, чтобы получить результаты, подобные этому:

   id_A  id_B  f1_A-f1_B  f2_A-f2_B  f3_A-f3_B  t
      1     2    -3          -3         -3      1
      2     3    -3          -3         -3      0
      3     4    -1           1          3      1

То есть, (3-й к5-й столбец в df) substract (от 6-го до 8-го столбца в df) при изменении индекса столбцов на fx_A-fy_A.

Я пытался использовать

df[cols[2:5]].sub(df[cols[5:8]], fill_value=0)

Тем не менее, результат определенно не тот, который я хотел:

   f1_A  f1_B  f2_A  f2_B  f3_A  f3_B
    1.0  -4.0   2.0  -5.0   3.0  -6.0
    4.0  -7.0   5.0  -8.0   6.0  -9.0
    7.0  -8.0   8.0  -7.0   9.0  -6.0

Сейчас я понятия не имею, как достичь желаемых результатов.Извините за мой английский, я все еще новичок в Python, любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Один из способов - фильтровать столбцы на основе того, заканчиваются ли они на _A или _B, а затем выполнять вычисления на этих отфильтрованных данных. Поместите все остальные столбцы в свой индекс, а затем сбросьте индекс в конце, чтобы вернуть их:

df.set_index(['id_A','id_B','t'],inplace=True)

A = df.filter(regex='f*_A')
B = df.filter(regex='f*_B')

new_df = (A.values - B)

# Join your column names
new_df.columns = ['-'.join((x,y)) for x,y in zip(A.columns,B.columns)]

new_df.reset_index(inplace=True)

>>> new_df
   id_A  id_B  t  f1_A-f1_B  f2_A-f2_B  f3_A-f3_B
0     1     2  1         -3         -3         -3
1     2     3  0         -3         -3         -3
2     3     4  1         -1          1          3
0 голосов
/ 27 октября 2018

Попробуйте это:

df['f1_A-f1_B'] = df['f1_A'] - df['f1_B']
df['f2_A-f2_B'] = df['f2_A'] - df['f2_B']
df['f3_A-f3_B'] = df['f3_A'] - df['f3_B']
print(df[['id_A', 'id_B', 'f1_A-f1_B', 'f2_A-f2_B', 'f3_A-f3_B', 't']])
#    id_A  id_B  f1_A-f1_B  f2_A-f2_B  f3_A-f3_B  t
# 0     1     2    -3          -3         -3      1
# 1     2     3    -3          -3         -3      0
# 2     3     4    -1           1          3      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...