Mike
Mike

Reputation: 2751

How can I add a tabbed separator to pandas dataframe rows and save the output to a file?

I am trying to apply a tab as a separator to the dataframe before saving, but something wonky is happening with the Day of Week column? Any ideas? Is there an easier approach using some type of fixed-width columns instead? Thanks!

entries = [{test_columns[index][0]:column for index, column in enumerate(value)} for value in test_cursor.fetchall()]
results = pd.DataFrame(entries)
results = results[['Test','Day of Week','Test Date','Number']]
results.to_csv('file.txt', sep='\t', index=False, header=False)

Current Output:

VERSCH  Tuesday 07/05/2016      3333333333
VERSCH  Tuesday 07/05/2016      3333333333
VERSCH  Tuesday 07/05/2016      3333333333
VERSCH  Wednesday       07/06/2016      3333333333
VERSCH  Wednesday       07/06/2016      3333333333
VERSCH  Wednesday       07/06/2016      3333333333
VERSCH  Thursday        07/07/2016      3333333333
VERSCH  Thursday        07/07/2016      3333333333
VERSCH  Thursday        07/07/2016      3333333333
VERSCH  Thursday        07/07/2016      3333333333
VERSCH  Friday  07/08/2016      3333333333
VERSCH  Friday  07/08/2016      3333333333
VERSCH  Monday  07/11/2016      3333333333
VERSCH  Monday  07/11/2016      3333333333
VERSCH  Monday  07/11/2016      3333333333

Desired Output:

VERSCH  Tuesday         07/05/2016      3333333333
VERSCH  Tuesday         07/05/2016      3333333333
VERSCH  Tuesday         07/05/2016      3333333333
VERSCH  Wednesday       07/06/2016      3333333333
VERSCH  Wednesday       07/06/2016      3333333333
VERSCH  Wednesday       07/06/2016      3333333333
VERSCH  Thursday        07/07/2016      3333333333
VERSCH  Thursday        07/07/2016      3333333333
VERSCH  Thursday        07/07/2016      3333333333
VERSCH  Thursday        07/07/2016      3333333333
VERSCH  Friday          07/08/2016      3333333333
VERSCH  Friday          07/08/2016      3333333333
VERSCH  Monday          07/11/2016      3333333333
VERSCH  Monday          07/11/2016      3333333333
VERSCH  Monday          07/11/2016      3333333333

Upvotes: 2

Views: 810

Answers (2)

piRSquared
piRSquared

Reputation: 294318

Apply a string formatter:

str_fmt = "{Test:<10s}  {Day of Week:<10s}  {Test Date:>10s}  {Number:>10s}"
print results \
        .apply(lambda x: str_fmt.format(**x.to_dict()), axis=1) \
        .to_frame().to_csv(header=None, index=None)

VERSCH      Tuesday     07/05/2016  3333333333
VERSCH      Tuesday     07/05/2016  3333333333
VERSCH      Tuesday     07/05/2016  3333333333
VERSCH      Wednesday   07/06/2016  3333333333
VERSCH      Wednesday   07/06/2016  3333333333
VERSCH      Wednesday   07/06/2016  3333333333
VERSCH      Thursday    07/07/2016  3333333333
VERSCH      Thursday    07/07/2016  3333333333
VERSCH      Thursday    07/07/2016  3333333333
VERSCH      Thursday    07/07/2016  3333333333
VERSCH      Friday      07/08/2016  3333333333
VERSCH      Friday      07/08/2016  3333333333
VERSCH      Monday      07/11/2016  3333333333
VERSCH      Monday      07/11/2016  3333333333
VERSCH      Monday      07/11/2016  3333333333

Upvotes: 0

Merlin
Merlin

Reputation: 25639

Try this:

   df["Day"] = df["Day"].str.pad(10, side='left', fillchar=' ')
   print df["Day"].head()

    0       Tuesday
    1       Tuesday
    2       Tuesday
    3     Wednesday
    4     Wednesday
    Name: Day, dtype: object

    print df

         Test         Day      Test.1      Number
    0   VERSCH     Tuesday  07/05/2016  3333333333
    1   VERSCH     Tuesday  07/05/2016  3333333333
    2   VERSCH     Tuesday  07/05/2016  3333333333
    3   VERSCH   Wednesday  07/06/2016  3333333333
    4   VERSCH   Wednesday  07/06/2016  3333333333
    5   VERSCH   Wednesday  07/06/2016  3333333333
    6   VERSCH    Thursday  07/07/2016  3333333333
    7   VERSCH    Thursday  07/07/2016  3333333333
    8   VERSCH    Thursday  07/07/2016  3333333333
    9   VERSCH    Thursday  07/07/2016  3333333333
    10  VERSCH      Friday  07/08/2016  3333333333
    11  VERSCH      Friday  07/08/2016  3333333333
    12  VERSCH      Monday  07/11/2016  3333333333
    13  VERSCH      Monday  07/11/2016  3333333333
    14  VERSCH      Monday  07/11/2016  3333333333

Upvotes: 2

Related Questions