def add_rows(self, data=None, **kwargs):
    "Concatenate a dataframe to the bottom of the current one.\n\n        Parameters\n        ----------\n        data : pandas.DataFrame, pandas.Styler, numpy.ndarray, Iterable, dict,\n        or None\n            Table to concat. Optional.\n\n        **kwargs : pandas.DataFrame, numpy.ndarray, Iterable, dict, or None\n            The named dataset to concat. Optional. You can only pass in 1\n            dataset (including the one in the data parameter).\n\n        Example\n        -------\n        >>> df1 = pd.DataFrame(\n        ...    np.random.randn(50, 20),\n        ...    columns=('col %d' % i for i in range(20)))\n        ...\n        >>> my_table = st.table(df1)\n        >>>\n        >>> df2 = pd.DataFrame(\n        ...    np.random.randn(50, 20),\n        ...    columns=('col %d' % i for i in range(20)))\n        ...\n        >>> my_table.add_rows(df2)\n        >>> # Now the table shown in the Streamlit app contains the data for\n        >>> # df1 followed by the data for df2.\n\n        You can do the same thing with plots. For example, if you want to add\n        more data to a line chart:\n\n        >>> # Assuming df1 and df2 from the example above still exist...\n        >>> my_chart = st.line_chart(df1)\n        >>> my_chart.add_rows(df2)\n        >>> # Now the chart shown in the Streamlit app contains the data for\n        >>> # df1 followed by the data for df2.\n\n        And for plots whose datasets are named, you can pass the data with a\n        keyword argument where the key is the name:\n\n        >>> my_chart = st.vega_lite_chart({\n        ...     'mark': 'line',\n        ...     'encoding': {'x': 'a', 'y': 'b'},\n        ...     'datasets': {\n        ...       'some_fancy_name': df1,  # <-- named dataset\n        ...      },\n        ...     'data': {'name': 'some_fancy_name'},\n        ... }),\n        >>> my_chart.add_rows(some_fancy_name=df2)  # <-- name used as keyword\n\n        "
    if ((self._container is None) or (self._cursor is None)):
        return self
    if (not self._cursor.is_locked):
        raise StreamlitAPIException('Only existing elements can `add_rows`.')
    if ((data is not None) and (len(kwargs) == 0)):
        name = ''
    elif (len(kwargs) == 1):
        (name, data) = kwargs.popitem()
    else:
        raise StreamlitAPIException('Wrong number of arguments to add_rows().Command requires exactly one dataset')
    if ((self._cursor.props['delta_type'] in DELTAS_TYPES_THAT_MELT_DATAFRAMES) and (self._cursor.props['last_index'] is None)):
        st_method_name = self._cursor.props['delta_type']
        st_method = getattr(self, st_method_name)
        st_method(data, **kwargs)
        return
    (data, self._cursor.props['last_index']) = _maybe_melt_data_for_add_rows(data, self._cursor.props['delta_type'], self._cursor.props['last_index'])
    msg = ForwardMsg_pb2.ForwardMsg()
    msg.metadata.parent_block.container = self._container
    msg.metadata.parent_block.path[:] = self._cursor.path
    msg.metadata.delta_id = self._cursor.index
    import streamlit.elements.data_frame_proto as data_frame_proto
    data_frame_proto.marshall_data_frame(data, msg.delta.add_rows.data)
    if name:
        msg.delta.add_rows.name = name
        msg.delta.add_rows.has_name = True
    _enqueue_message(msg)
    return self
Concatenate a dataframe to the bottom of the current one.

Parameters
----------
data : pandas.DataFrame, pandas.Styler, numpy.ndarray, Iterable, dict,
or None
    Table to concat. Optional.

**kwargs : pandas.DataFrame, numpy.ndarray, Iterable, dict, or None
    The named dataset to concat. Optional. You can only pass in 1
    dataset (including the one in the data parameter).

Example
-------
>>> df1 = pd.DataFrame(
...    np.random.randn(50, 20),
...    columns=('col %d' % i for i in range(20)))
...
>>> my_table = st.table(df1)
>>>
>>> df2 = pd.DataFrame(
...    np.random.randn(50, 20),
...    columns=('col %d' % i for i in range(20)))
...
>>> my_table.add_rows(df2)
>>> # Now the table shown in the Streamlit app contains the data for
>>> # df1 followed by the data for df2.

You can do the same thing with plots. For example, if you want to add
more data to a line chart:

>>> # Assuming df1 and df2 from the example above still exist...
>>> my_chart = st.line_chart(df1)
>>> my_chart.add_rows(df2)
>>> # Now the chart shown in the Streamlit app contains the data for
>>> # df1 followed by the data for df2.

And for plots whose datasets are named, you can pass the data with a
keyword argument where the key is the name:

>>> my_chart = st.vega_lite_chart({
...     'mark': 'line',
...     'encoding': {'x': 'a', 'y': 'b'},
...     'datasets': {
...       'some_fancy_name': df1,  # <-- named dataset
...      },
...     'data': {'name': 'some_fancy_name'},
... }),
>>> my_chart.add_rows(some_fancy_name=df2)  # <-- name used as keyword
def add_rows(self, data=None, **kwargs):
    "Concatenate a dataframe to the bottom of the current one.\n\n        Parameters\n        ----------\n        data : pandas.DataFrame, pandas.Styler, numpy.ndarray, Iterable, dict,\n        or None\n            Table to concat. Optional.\n\n        **kwargs : pandas.DataFrame, numpy.ndarray, Iterable, dict, or None\n            The named dataset to concat. Optional. You can only pass in 1\n            dataset (including the one in the data parameter).\n\n        Example\n        -------\n        >>> df1 = pd.DataFrame(\n        ...    np.random.randn(50, 20),\n        ...    columns=('col %d' % i for i in range(20)))\n        ...\n        >>> my_table = st.table(df1)\n        >>>\n        >>> df2 = pd.DataFrame(\n        ...    np.random.randn(50, 20),\n        ...    columns=('col %d' % i for i in range(20)))\n        ...\n        >>> my_table.add_rows(df2)\n        >>> # Now the table shown in the Streamlit app contains the data for\n        >>> # df1 followed by the data for df2.\n\n        You can do the same thing with plots. For example, if you want to add\n        more data to a line chart:\n\n        >>> # Assuming df1 and df2 from the example above still exist...\n        >>> my_chart = st.line_chart(df1)\n        >>> my_chart.add_rows(df2)\n        >>> # Now the chart shown in the Streamlit app contains the data for\n        >>> # df1 followed by the data for df2.\n\n        And for plots whose datasets are named, you can pass the data with a\n        keyword argument where the key is the name:\n\n        >>> my_chart = st.vega_lite_chart({\n        ...     'mark': 'line',\n        ...     'encoding': {'x': 'a', 'y': 'b'},\n        ...     'datasets': {\n        ...       'some_fancy_name': df1,  # <-- named dataset\n        ...      },\n        ...     'data': {'name': 'some_fancy_name'},\n        ... }),\n        >>> my_chart.add_rows(some_fancy_name=df2)  # <-- name used as keyword\n\n        "
    if ((self._container is None) or (self._cursor is None)):
        return self
    if (not self._cursor.is_locked):
        raise StreamlitAPIException('Only existing elements can `add_rows`.')
    if ((data is not None) and (len(kwargs) == 0)):
        name = 
    elif (len(kwargs) == 1):
        (name, data) = kwargs.popitem()
    else:
        raise StreamlitAPIException('Wrong number of arguments to add_rows().Command requires exactly one dataset')
    if ((self._cursor.props['delta_type'] in DELTAS_TYPES_THAT_MELT_DATAFRAMES) and (self._cursor.props['last_index'] is None)):
        st_method_name = self._cursor.props['delta_type']
        st_method = getattr(self, st_method_name)
        st_method(data, **kwargs)
        return
    (data, self._cursor.props['last_index']) = _maybe_melt_data_for_add_rows(data, self._cursor.props['delta_type'], self._cursor.props['last_index'])
    msg = ForwardMsg_pb2.ForwardMsg()
    msg.metadata.parent_block.container = self._container
    msg.metadata.parent_block.path[:] = self._cursor.path
    msg.metadata.delta_id = self._cursor.index
    import streamlit.elements.data_frame_proto as data_frame_proto
    data_frame_proto.marshall_data_frame(data, msg.delta.add_rows.data)
    if name:
        msg.delta.add_rows.name = name
        msg.delta.add_rows.has_name = True
    _enqueue_message(msg)
    return self