# Watch a dataframe

**URL:** <https://discourse.holoviz.org/t/watch-a-dataframe/5108>\
**Category:** Panel\
**Tags:** param, panel\
**Created:** [March 19, 2023, 12:35am UTC](https://discourse.holoviz.org/t/watch-a-dataframe/5108 "2023-03-19T00:35:14Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![CongTang](https://discourse.holoviz.org/user_avatar/discourse.holoviz.org/congtang/32/3055_2.png) [@CongTang](https://discourse.holoviz.org/u/CongTang)\
**Post date:** [March 19, 2023, 12:35am UTC](https://discourse.holoviz.org/t/watch-a-dataframe/5108/1 "2023-03-19T00:35:14Z")

</div>

Hi

I am trying to write a program to watch a change in a data frame, but it seems the depend can not catch the change.

There is a minimized example:

```auto
import param
import panel as pn
from panel.viewable import Viewer
import pandas as pd
pn.extension() 

df = pd.DataFrame(columns = ['A','B'])

class game_page(Viewer):
    
    player_info = param.DataFrame(df)
   
    def clicked(self,event):
        self.player_info.loc[len(self.player_info)] = ['new' for x in range(2)]   

    def __init__ (self, **params):
        self.button = pn.widgets.Button(name = 'click')
        self.button.on_click(self.clicked)    
        self.view = pn.pane.DataFrame(self.player_info)
        
        super(). __init__ (**params)
        self._layout = pn.Row(self.button, self.view)

    
    def __panel__ (self):
        return self._layout
    
    @param.depends('player_info', watch=True)
    def _sync_widgets(self):
        self.view.object = self.player_info
        print(f'runed')
        
    
a = game_page()

pn.Column(
    a
)

```

any suggestion will be grateful.

Kind regards  
Victor

---

<div class="post-metadata">

**Author:** ![Marc](https://discourse.holoviz.org/user_avatar/discourse.holoviz.org/marc/32/24_2.png) [@Marc](https://discourse.holoviz.org/u/Marc)\
**Post date:** [March 19, 2023, 7:08am UTC](https://discourse.holoviz.org/t/watch-a-dataframe/5108/2 "2023-03-19T07:08:59Z")

</div>

Hi @CongTang

`param.depends` watches for changes to the `player_info` parameter value. I.e. if the value of `player_info` is replaced with a new one. It does and cannot watch for _mutations_ of the existing value.

What you can do is to manually trigger an event via `self.param.trigger('player_info')` to signal that the `player_info` value changed.

![param-trigger](https://discourse.holoviz.org/uploads/default/original/2X/1/10ee6791af5543ab41f0a5a8ee05808af79b762f.gif)

```python
import pandas as pd
import panel as pn
import param

pn.extension() 

df = pd.DataFrame(columns = ['A','B'])

class game_page(pn.viewable.Viewer):
    
    player_info = param.DataFrame(df)
   
    def clicked(self,event):
        self.player_info.loc[len(self.player_info)] = ['new' for x in range(2)]   
        self.param.trigger("player_info")

    def __init__ (self, **params):
        self.button = pn.widgets.Button(name = 'click')
        self.button.on_click(self.clicked)    
        self.view = pn.pane.DataFrame(self.player_info)
        
        super(). __init__ (**params)
        self._layout = pn.Row(self.button, self.view)

    
    def __panel__ (self):
        return self._layout
    
    @param.depends('player_info', watch=True)
    def _sync_widgets(self):
        self.view.object = self.player_info
        print(f'updated')
        
    
a = game_page()

pn.Column(
    a
).servable()

```

An alternative to using `self.param.trigger` would be to replace the value of `player_info` with a new dataframe. Or if performance is a concern to [stream values to the Tabulator table](https://panel.holoviz.org/reference/widgets/Tabulator.html#streaming).

---

<div class="post-metadata">

**Author:** ![CongTang](https://discourse.holoviz.org/user_avatar/discourse.holoviz.org/congtang/32/3055_2.png) [@CongTang](https://discourse.holoviz.org/u/CongTang)\
**Post date:** [March 19, 2023, 6:49pm UTC](https://discourse.holoviz.org/t/watch-a-dataframe/5108/3 "2023-03-19T18:49:23Z")

</div>

really thanks for that marc. that works. XD
