Присвойте массив numpy маске панд - PullRequest
2 голосов
/ 01 июля 2019

Я выполнил задачу на подмножестве панд, замаскированном:

pdxy = pd.DataFrame(data,columns=['X','Y','C','CC'])
mask = pdxy[:]['Y']==8

print("pdxy[mask]")
print(pdxy[mask][:10])

pdxy[mask]
       X  Y  C  CC
17    17  8  0   0
18    18  8  0   0
48    48  8  0   0
56    56  8  0   0
63    63  8  0   0
66    66  8  0   0
73    73  8  0   0
87    87  8  0   0
103  103  8  0   0
116  116  8  0   0

kmeans = KMeans(n_clusters=5,random_state=0).fit(pdxy[mask]['X','Y'])

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

pdxy.loc[mask]['C']  = np.array(kmeans.labels_)
pdxy.loc[mask]['CC'] = np.array(kmeans.cluster_centers_[kmeans.labels_])[:,0]

К сожалению, DataFrame не изменяется, то есть, как и до назначения:

print("pdxy[mask] labeled")
print(pdxy[mask][:10]) 

pdxy[mask] labeled
       X  Y  C  CC
17    17  8  0   0
18    18  8  0   0
48    48  8  0   0
56    56  8  0   0
63    63  8  0   0
66    66  8  0   0
73    73  8  0   0
87    87  8  0   0
103  103  8  0   0
116  116  8  0   0

Что я могу сделать?

1 Ответ

2 голосов
/ 01 июля 2019

доступ к строке + столбцу с помощью .loc осуществляется через запятую, как [row, col], а не [row] [col]

попробуйте это:

import numpy as np
import pandas as pd

pdxy = pd.DataFrame(data, columns=['X', 'Y', 'C', 'CC'])
mask = pdxy[:]['Y'] == 8

kmeans = KMeans(n_clusters=5,random_state=0).fit(pdxy[mask]['X','Y'])

pdxy.loc[mask, 'C']  = np.array(kmeans.labels_)
pdxy.loc[mask, 'CC'] = np.array(kmeans.cluster_centers_[kmeans.labels_])[:,0]

print("pdxy[mask] labeled")
print(pdxy[mask][:10]) 
...