Source code for hypertools.tools.df2mat
#!/usr/bin/env python
import pandas as pd
[docs]
def df2mat(data, return_labels=False):
"""
Transforms a Pandas DataFrame into a Numpy array with binarized text columns
This function transforms single-level df to an array so it can be plotted
with HyperTools. Additionally, it uses the Pandas.Dataframe.get_dummies
function to transform text columns into binary vectors, or
'dummy variables'.
Parameters
----------
data : A single-level Pandas DataFrame
The df that you want to convert. Note that this currently only works
with single-level (not Multi-level indices).
return_labels : bool
If True, also return a list of column labels for the transformed
array (default: False).
Returns
-------
plot_data : Numpy array
A Numpy array where text columns are turned into binary vectors.
labels : list (optional)
A list of column labels for the numpy array. To return this, set
return_labels=True.
"""
# pandas >= 3 stores text columns as the dedicated 'str' dtype;
# select_dtypes(include=['object']) only matches them via deprecated
# back-compat (Pandas4Warning, slated for removal -- after which text
# columns would silently stay in df_num as an object array that
# np.isnan/reducers cannot handle). Select both kinds explicitly;
# pandas < 3 rejects 'str' with a TypeError, so fall back there.
try:
df_str = data.select_dtypes(include=['object', 'str'])
df_num = data.select_dtypes(exclude=['object', 'str'])
except TypeError: # pandas < 3: no dedicated 'str' dtype
df_str = data.select_dtypes(include=['object'])
df_num = data.select_dtypes(exclude=['object'])
for colname in df_str.columns:
# dtype=float: pandas >= 2.0 defaults get_dummies to bool, and
# joining bool dummies with float columns makes .values an
# object-dtype array that np.isnan / reducers cannot handle
df_num = df_num.join(pd.get_dummies(data[colname], prefix=colname,
dtype=float))
plot_data = df_num.values
labels=list(df_num.columns.values)
if return_labels:
return plot_data,labels
else:
return plot_data