Индексирование рядов панд с целочисленным значением
У меня есть две серии панд, как следующие.
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