熊猫:计算行的平均值

时间:2019-07-09 22:41:21

标签: python pandas

我有一个类似的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

但是对于具有100万行的df,此过程非常漫长。还有其他方法吗?

编辑 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 个答案:

答案 0 :(得分:1)

您想在windows中拆分单词,以便拥有n x 3数据框。然后使用replacemean(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中的列表当前大小相同时,该功能才有效。