10

I have the following code.

s2 = pd.Series([100,"PYTHON","Soochow","Qiwsir"],
               index=["mark","title","university","name"])

s2.mark = "102"

s2.price = "100"

When I print s2 , I can see the value of mark was changed and there is no price; but I can get result by printing s2.price. Why is the price not printed?

Anshul Goyal
  • 73,278
  • 37
  • 149
  • 186
C.Ming
  • 159
  • 5
  • 8
    Meta: [Why is this a bad question-?](https://meta.stackoverflow.com/questions/365834/why-is-this-a-bad-question) - consensus is, it's not. – jpp Apr 10 '18 at 17:47

1 Answers1

10

You are confusing attributes with series indices.

The syntax s2.xyz = 100 first looks for xyz in the series index and overwrites it if it exists.

If it does not exist, it adds a new attribute to the series.

How to add an attribute

if 'price' not in s2:
    s2.price = 100

You should not add attributes which conflict with indices; this is asking for trouble given the similar syntax permitted for access.

How to add an element to series

In order to add an element to the series with an index, use pd.Series.loc:

s2.loc['price'] = 100

How to tell the difference

Run s2.__dict__. You will find:

{'_data': SingleBlockManager
 Items: Index(['mark', 'title', 'university', 'name'], dtype='object')
 ObjectBlock: 4 dtype: object,
 '_index': Index(['mark', 'title', 'university', 'name'], dtype='object'),
 '_item_cache': {},
 '_name': None,
 '_subtyp': 'series',
 'is_copy': None,
 'price': '100'}

It is clear that price has been added as an attribute, not as an index.

jpp
  • 159,742
  • 34
  • 281
  • 339