Pandas数据框以逗号分隔并注意数据类型

时间:2017-01-09 22:44:09

标签: python python-3.x pandas

我有一个像这样的数据框:

import pandas as pd
trx = {
    'transaction_id': [1,2],
    'date': ['1/1/2017','1/2/2017'],
    'sale_amt': [50.25,99.30],
    'user': ['foo','bar']
    }
df = pd.DataFrame(trx, columns = ['transaction_id','date','sale_amt','user'])
df

   transaction_id      date  sale_amt user
0               1  1/1/2017     50.25  foo
1               2  1/2/2017     99.30  bar

现在我要做的是将这个小数据框转换为每行的逗号分隔列表,我已经设法这样做了:

df2 = df.apply(lambda row: ','.join(map(str,row)),axis=1)
df2

0    1,1/1/2017,50.25,foo
1     2,1/2/2017,99.3,bar

足够公平,但我希望这更具活力。我想要单引号来环绕文本和日期字段。所以我想我可以创建一个包含所有数据类型的列表并从那里获取它,除了我不知道该怎么做...

coltypes = ["int","date","num","text"]

期望的输出:

0    1,'1/1/2017',50.25,'foo'
1     2,'1/2/2017',99.3,'bar'

如何使用coltypes数据类型列表实现所需的输出?

2 个答案:

答案 0 :(得分:3)

如果在调用path_or_buf函数时未指定df.to_csv()参数,则会将CSV文件内容作为字符串返回。之后我们可以将它分成不同的行:

In [291]: import csv

In [292]: pd.Series(df.to_csv(header=None, index=False,
     ...:                     quoting=csv.QUOTE_NONNUMERIC).split(),
     ...:           index=df.index)
     ...:
Out[292]:
0    1,"1/1/2017",50.25,"foo"
1     2,"1/2/2017",99.3,"bar"
dtype: object

答案 1 :(得分:0)

使用repr()可以在特定情况下快速轻松地完成工作。

import pandas as pd
trx = {
    'transaction_id': [1,2],
    'date': ['1/1/2017','1/2/2017'],
    'sale_amt': [50.25,99.30],
    'user': ['foo','bar']
    }

trx['date'] = list(map(repr, trx['date']))
trx['user'] = list(map(repr, trx['user']))

或者,您也可以在整个DataFrame中应用repr()函数,因为数字字段不会在它们周围显示单引号。