Индексирование рядов панд с целочисленным значением

У меня есть две серии панд, как следующие.

bulk_order_id
Out[283]: 
3    523
Name: order_id, dtype: object

а также

luster_6_loc
Out[285]: 
3    Cluster 3
Name: Clusters, dtype: object

Теперь я хочу новую серию, которая бы выглядела так.

Cluster 3  523

Я делаю следующее в питоне

cluster_final = pd.Series()
for i in range(len(cluster_6_loc)):
    cluster_final.append(pd.Series(bulk_order_id.values[i], index =  
    cluster_6_loc.iloc[i]))

Что дает мне ошибку, говоря

TypeError: Index(...) must be called with a collection of some kind, 'Cluster 3' was passed

3 ответа

Решение

Может быть, лучше использовать concat а также set_index:

print bulk_order_id

1    523
2    528
3    527
4    573
Name: order_id, dtype: object

print cluster_6_loc

1    Cluster 1
2    Cluster 2
3    Cluster 3
4    Cluster 4
Name: Clusters, dtype: object

cluster_final = pd.concat([bulk_order_id, cluster_6_loc], axis=1).set_index('Clusters')
#reset index name
cluster_final.index.name = ''

print cluster_final.ix[:,0]

Cluster 1    523
Cluster 2    528
Cluster 3    527
Cluster 4    573
Name: order_id, dtype: object

Вы могли бы перейти к pd.Series значения luster_6_loc в качестве индекса и значения bulk_order_id как значения:

bulk_order_id = pd.Series(523, index=[3])
cluster_6_loc= pd.Series('Cluster 3', index=[3])

cluster_final = pd.Series(bulk_order_id.values, cluster_6_loc.values)

In [149]: cluster_final 
Out[149]:
Cluster 3    523
dtype: int64

РЕДАКТИРОВАТЬ

Странно, но кажется, что append в Series не работает правильно (по крайней мере, в версии 0.17.1):

s = pd.Series()

In [199]: s.append(pd.Series(1, index=[0]))
Out[199]:
0    1
dtype: int64

In [200]: s
Out[200]: Series([], dtype: float64)

Кстати, для вашего случая вы могли бы сделать set_value:

cluster_final = pd.Series()
for i in range(len(cluster_6_loc)):
    cluster_final.set_value(cluster_6_loc.iloc[i], bulk_order_id.values[i])

In [209]: cluster_final
Out[209]:
Cluster 3    523
dtype: int64

Не уверен, правильно ли я понимаю ваш вопрос, но что не так с pd.concat() ( см. документы):

s1 = pd.Series(data=['523'], index=[3])

3    523
dtype: object

s2 = pd.Series(data=['Cluster 3'], index=[3])

3    Cluster 3
dtype: object

и используя pd.concat(), который также будет работать для нескольких значений:

pd.concat([s1, s2], axis=1)

     0          1
3  523  Cluster 3

в результате чего DataFrame это то, что вам, вероятно, все равно понадобится при комбинировании Series с несколькими значениями. Вы можете переместить любой из values к index с помощью .set_index()или добавить .squeeze() чтобы получить Series вместо.

Так pd.concat([s1, s2], axis=1).set_index(1) дает:

             0
1             
Cluster 3  523
Другие вопросы по тегам