我有一个类似的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
答案 0 :(得分:1)
您想在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中的列表当前大小相同时,该功能才有效。