Панды: вычисление среднего значения для строк - PullRequest
0 голосов
/ 10 июля 2019

У меня есть df, который выглядит так:

                     C   E    H
     window
(AAA, AAA, AAA)      26  4  111
(AAA, AAA, AAC)       3  1    1

И словарь под названием p_dict. Каждое значение в df['window'] имеет три набора букв, и каждый из трех наборов является ключом в моем p_dict. То, что я сделал до сих пор, чтобы достичь того, чего я хочу, это:

dim_list = []
for word in df['window']:
   a = p_dict[word[2:5]] # len of 100
   b = p_dict[word[9:12]] # len of 100
   c = p_dict[word[16:19]] # len of 100

   flav = [statistics.mean(k) for k in zip(a, b, c)]
   dim_list.append(flav)

df['dimensions'] = dim_list

Но этот процесс очень длинный для df с 1 миллионами строк. Есть ли другой способ сделать это?

Редактировать p_dict выглядит {'AAA':[0.2, 12, 301..], 'AAC':[31, 0.91, 8..]} где каждое значение является вложением в 100-мерное пространство.

Что я хочу получить: Для каждого триплета в окне получите 100 измерений из словаря и вычислите среднее значение, чтобы получить один средний список измерений. так для окна (AAA, AAA, AAC):

AAA -> p_dict['AAA'] -> [100 dimensions] # list 1
AAA -> p_dict['AAA'] -> [100 dimensions] # list 2
AAC -> p_dict['AAC'] -> [100 dimensions] # list 3
output = average of list 1 + 2 + 3

1 Ответ

1 голос
/ 10 июля 2019

Вы хотите разделить слова в windows, чтобы у вас был n x 3 фрейм данных.Затем используйте replace и mean(axis=1):

df = pd.DataFrame({'window': ['(AAA, AAA, AAA)', '(AAA, AAA, AAC)'],
 'C': [26, 3],
 'E': [4, 1],
 'H': [111, 1]})

p_dict = {'AAA':1, 'AAC':2}

(df['window'].str[1:-1]
             .str.split(',\s*', expand=True)
             .replace(p_dict).mean(axis=1)
)

:

0    1.000000
1    1.333333
dtype: float64

В случае, если ваш p_dict является списком, нам нужно только немного подправить:

p_dict = {'AAA':[0.2, 12, 301.], 'AAC':[31, 0.91, 8.]} 
p_df = pd.DataFrame(p_dict).T

new_df = (df['window'].str[1:-1]
             .str.split(',\s*', expand=True)
             .stack()
         )

pd.DataFrame(p_df.loc[new_df].values, 
             index=new_df.index).mean(level=0)

дает вам:

           0          1           2
0   0.200000  12.000000  301.000000
1  10.466667   8.303333  203.333333

Примечание это работает, только если списки в dict сейчас имеют одинаковый размер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...