Skip to content

Commit 35b1779

Browse files
more general df_wrapcols() method that can wrap multiple columns
1 parent 5444dae commit 35b1779

File tree

1 file changed

+36
-28
lines changed

1 file changed

+36
-28
lines changed

examples/scratch_pad/fmtr.py

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -43,41 +43,49 @@ def left_formatter(value):
4343
return f'{value:<{w}.{w}s}'
4444
return left_formatter
4545

46-
WRAPLEN=55
46+
def df_wrapcols(df,wrap_columns=None):
4747

48-
def df_wrapcol(df,wrap_column=None,wrap_length=None):
48+
if wrap_columns is None: return df
49+
if not isinstance(wrap_columns,dict):
50+
raise TypeError('wrap_columns must be a dict of column_names and wrap_lengths')
4951

50-
if wrap_column is None: return df
51-
if wrap_length is None: return df
52+
for col in wrap_columns:
53+
if col not in df.columns:
54+
raise ValueError('column "'+str(col)+'" not found in df.columns')
5255

5356
index = []
54-
columns = {}
57+
column_data = {}
5558
for col in df.columns:
56-
columns[col] = []
57-
nonwrapcols = [col for col in df.columns if col != wrap_column]
58-
59+
column_data[col] = []
60+
5961
for ix in df.index:
6062
row = df.loc[ix,]
61-
62-
swrap = str(row[wrap_column])
63-
tw = textwrap.wrap(swrap,wrap_length) if not swrap.isspace() else [' ']
64-
65-
columns[wrap_column].append(tw[0])
66-
index.append(str(ix))
67-
for col in nonwrapcols:
68-
columns[col].append(row[col])
69-
70-
if len(tw) > 1:
71-
for r in range(1,len(tw)):
72-
columns[wrap_column].append(tw[r])
73-
index.append(str(ix)+'.'+str(r))
74-
for col in nonwrapcols:
75-
columns[col].append(' ')
76-
77-
return pd.DataFrame(columns,index=index)
78-
79-
80-
df = df_wrapcol(df,wrap_column='Description',wrap_length=WRAPLEN)
63+
64+
row_data = {}
65+
for col in row.index:
66+
cstr = str(row[col])
67+
if col in wrap_columns:
68+
wlen = wrap_columns[col]
69+
tw = textwrap.wrap(cstr,wlen) if not cstr.isspace() else [' ']
70+
else:
71+
tw = [cstr]
72+
row_data[col] = tw
73+
74+
cmax = max(row_data,key=lambda k: len(row_data[k]))
75+
rlen = len(row_data[cmax])
76+
for r in range(rlen):
77+
for col in row.index:
78+
extension = [' ']*(rlen - len(row_data[col]))
79+
row_data[col].extend(extension)
80+
column_data[col].append(row_data[col][r])
81+
ixstr = str(ix)+'.'+str(r) if r > 0 else str(ix)
82+
index.append(ixstr)
83+
84+
return pd.DataFrame(column_data,index=index)
85+
86+
WRAPLEN = 55
87+
88+
df = df_wrapcols(df,wrap_columns={'Description':WRAPLEN})
8189
print('===========================')
8290
print('dfnew1=',df)
8391

0 commit comments

Comments
 (0)