Выполните итерацию по каждой строке в кадре данных pandas и умножьте все значения строки на одно из значений строки в одном и том же кадре данных - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь нормализовать значения строк в кадре данных. Значения, которые необходимо нормализовать, содержат текст «Count» в заголовке столбца. Есть другие столбцы, в заголовке которых нет слова «Количество», и я бы хотел, чтобы они остались без изменений. У меня есть значение нормализации, которое находится в столбце с именем «Значение нормализации».

Поэтому при итерациях по строкам значение нормализации каждой строки необходимо умножать на каждое значение, принадлежащее столбцу, заголовок которого содержит слово «количество». Этот фрейм данных имеет мультииндекс, который я хотел бы сохранить, и состоит из большого количества столбцов и строк, поэтому мне нужно делать это без указания точных местоположений или имен.

Безрезультатно, я пробовал варианты умножения, трансляции, itertuples, пользовательских функций.

Это мой пример кадра данных:

Sample Timepoint CountA CountB PercentA PercentB CountC Normalization Value
1           1       10     20     40       30       50        .1
2           1       20     10     25       35       100       .2
2           2       50     20     20       22       40        .5

Это то, что я хотел бы, чтобы после нормализации счетчиков кадр данных выглядел:

Sample Timepoint CountA CountB PercentA PercentB CountC Normalization Value
1           1       1     2     40       30       5        .1
2           1       4     2     25       35       20       .2
2           2       25    10    20       22       20       .5

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Вы можете использовать str.contains, а затем присвоить результат mul обратно с помощью .loc, также здесь, поскольку вам нужно присвоить его обратно, с filter произойдет сбой

s=df.columns.str.contains('Count')
df.loc[:,s]=df.loc[:,s].mul(df['Normalization Value'],0)
df
Out[238]: 
   Sample  Timepoint         ...          CountC Normalization Value
0       1          1         ...             5.0                 0.1
1       2          1         ...            20.0                 0.2
2       2          2         ...            20.0                 0.5
[3 rows x 8 columns]
1 голос
/ 02 апреля 2019

Вам необходимо отфильтровать столбцы с помощью .filter() с помощью regex, а затем изменить их и вернуть обратно в основной фрейм данных с помощью .loc.

df.loc[:, df.filter(regex='Count*', axis=1).columns] = df.loc[:, df.filter(regex='Count*', axis=1).columns].multiply(df['Normalization'], axis='index')

Вывод:

      Sample  Timepoint  CountA  CountB  PercentA  PercentB  CountC  Normalization
0       1          1     1.0     2.0        40        30     5.0            0.1
1       2          1     4.0     2.0        25        35    20.0            0.2
2       2          2    25.0    10.0        20        22    20.0            0.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...