给定NumPy数组[A B]
,A
是不同的索引和B
计数值。
如何根据B
值规范化 A
值?
我试过了:
def normalize(np_array):
normalized_array = np.empty([1, 2])
indexes= np.unique(np_array[:, 0]).tolist()
for index in indexes:
index_array= np_array[np_array[:, 0] == index]
mean_id = np.mean(index_array[:, 1])
std_id = np.std(index_array[:, 1])
if mean_id * std_id > 0:
index_array[:, 1] = (index_array[:, 1] - mean_id) / std_id
normalized_array = np.concatenate([normalized_array, index_array])
return np.delete(normalized_array, 0, 0) # my apologies
正在做这项工作,但我正在寻找一种更高尚的方式来实现这一目标。
热烈欢迎任何意见。
答案 0 :(得分:2)
看起来pandas在这里可以提供帮助:
import pandas as pd
df = pd.DataFrame({'ID': [1, 1, 2, 2, 1],
'value': [10, 20, 15, 100, 12]})
byid = df.groupby('ID')
mean = byid.mean()
std = byid.std()
df['normalized'] = df.apply(lambda x: (x.value - mean.ix[x.ID]) / std.ix[x.ID], axis=1)
print(df)
输出:
ID value normalized
0 1 10 -0.755929
1 1 20 1.133893
2 2 15 -0.707107
3 2 100 0.707107
4 1 12 -0.377964
来自NumPy数组:
>>> a
array([[ 1, 10],
[ 1, 20],
[ 2, 15],
[ 2, 100],
[ 1, 12]])
您可以像这样创建数据框:
>>> df = pd.DataFrame({'ID': a[:, 0], 'value': a[:, 1]})
>>> df
ID value
0 1 10
1 1 20
2 2 15
3 2 100
4 1 12