Python熊猫,将数据帧写入固定宽度文件(到_fwf?)

Python熊猫,将数据帧写入固定宽度文件(到_fwf?),python,pandas,fixed-width,Python,Pandas,Fixed Width,我看到熊猫有read_-fwf,但它有类似DataFrame.to_-fwf的东西吗?我正在寻找对字段宽度、数字精度和字符串对齐的支持。看来,DataFrame.to_csv并不能做到这一点numpy.savetxt有,但我不想这样做: numpy.savetxt('myfile.txt', mydataframe.to_records(), fmt='some format') 这似乎是错误的。非常感谢您的想法。我相信您找到了解决此问题的方法,但对于其他好奇的人来说。。。 如果将DF写入列表

我看到熊猫有
read_-fwf
,但它有类似
DataFrame.to_-fwf
的东西吗?我正在寻找对字段宽度、数字精度和字符串对齐的支持。看来,
DataFrame.to_csv
并不能做到这一点
numpy.savetxt有,但我不想这样做:

numpy.savetxt('myfile.txt', mydataframe.to_records(), fmt='some format')

这似乎是错误的。非常感谢您的想法。

我相信您找到了解决此问题的方法,但对于其他好奇的人来说。。。 如果将DF写入列表,可以通过指定“格式为字符串”将其写入文件。格式(列表索引) 例如:

只需确保将每个索引与正确的格式匹配:)

希望有帮助

在有人加入pandas之前,您可以使用该软件包:

上述问题的答案对我很有帮助。这不是最好的,但在
to_fwf
存在之前,这将对我起作用

np.savetxt(r'c:\data\np.txt', df.values, fmt='%d')


对于每列的自定义格式,可以设置整行的格式。 fmt参数为每行提供格式设置

with open('output.dat') as ofile:
     fmt = '%.0f %02.0f %4.1f %3.0f %4.0f %4.1f %4.0f %4.1f %4.0f'
     np.savetxt(ofile, df.values, fmt=fmt)

找到了一个非常简单的解决方案!(Python)。在截取的代码中,我试图将数据帧写入位置文件。“finalDataFrame.values.tolist()”将返回一个列表,其中数据帧的每一行都将转换为另一个列表,即[['Camry',2019年,'Toyota'],['Mustang','2016','Ford']]。之后,在for循环和if语句的帮助下,我试图设置它的固定长度。休息是显而易见的

 with open (FilePath,'w') as f:
    for i in finalDataFrame.values.tolist():
        widths=(0,0,0,0,0,0,0)
        if i[2] == 'nan':
            i[2]=''
            for h in range(7):
                i[2]= i[2] + ' '
        else:
            x=7-len(str(i[2]))
            a=''
            for k in range(x):
               a=a+' '
            i[2]=str(i[2])+a

        if i[3] == '':
            i[3]=''
            for h in range(25):
                i[3]=i[3]+' '
        else:
            x = 25 - len(i[3])
            print(x)
            a = ''
            for k in range(x):
                a = a + ' '
            print(a)
            i[3] = i[3] + a


        i[4] = str(i[4])[:10]

        q="".join("%*s" % i for i in zip(widths, i))
        f.write(q+'\n')
这就是你所需要的。唯一的诀窍是如何管理索引

忽略索引 如果您不关心索引:

#编写
df.to_字符串(文件路径,索引=False)
#阅读
df=pd.read_fwf(文件路径)
句柄索引 如果要检索
pandas.Index
pandas.MultiIndex

#编写
df.reset_index()到_字符串(filepath,index=False)
#阅读
df=pd.read\u fwf(文件路径)。设置索引(索引名)
如果您的
索引
在写入时没有名称,
reset\u Index()
应将其分配给
列“Index”


如果您的
多索引
没有名称,则应将其分配到列
[“0级”、“1级”、…]

根据其他人的回答,以下是我编写的代码片段,而不是编码和性能最好的:

import pandas as pd
import pickle
import numpy as np
from tabulate import tabulate


left_align_gen = lambda length, value: eval(r"'{:<<<length>>}'.format('''<<value>>'''[0:<<length>>])".replace('<<length>>', str(length)).replace('<<value>>', str(value)))
right_align_gen = lambda length, value: eval(r"'{:><<length>>}'.format('''<<value>>'''[0:<<length>>])".replace('<<length>>', str(length)).replace('<<value>>', str(value)))

# df = pd.read_pickle("dummy.pkl")
with open("df.pkl", 'rb') as f:
    df = pickle.load(f)

# field width defines here, width of each field
widths=(22, 255, 14, 255, 14, 255, 255, 255, 255, 255, 255, 22, 255, 22, 255, 255, 255, 22, 14, 14, 255, 255, 255, 2, )

# format datetime
df['CREATED_DATE'] = df['CREATED_DATE'].apply(lambda x: x.to_pydatetime().strftime('%Y%m%d%H%M%S'))
df['LAST_MODIFIED_DATE'] = df['LAST_MODIFIED_DATE'].apply(lambda x: x.to_pydatetime().strftime('%Y%m%d%H%M%S'))
df['TERMS_ACCEPTED_DATE'] = df['TERMS_ACCEPTED_DATE'].apply(lambda x: x.to_pydatetime().strftime('%Y%m%d%H%M%S'))
df['PRIVACY_ACCEPTED_DATE'] = df['PRIVACY_ACCEPTED_DATE'].apply(lambda x: x.to_pydatetime().strftime('%Y%m%d%H%M%S'))


# print(type(df.iloc[0]['CREATED_DATE']))
# print(df.iloc[0])
record_line_list = []
# for row in df.iloc[:10].itertuples():
for row in [tuple(x) for x in df.to_records(index=False)]:
    record_line_list.append("".join(left_align_gen(length, value) for length, value in zip(widths, row)))

with open('output.txt', 'w') as f:
    f.write('\n'.join(record_line_list))
将熊猫作为pd导入
进口泡菜
将numpy作为np导入
从表格导入表格
left_align_gen=lambda长度,值:eval(r“{:}”。格式(“''''[0:])。替换('',str(长度))。替换('',str(值)))
#df=pd.read\u pickle(“dummy.pkl”)
以open(“df.pkl”,“rb”)作为f:
df=酸洗负荷(f)
#字段宽度在此定义每个字段的宽度
宽度=(22、255、14、255、14、255、255、255、255、255、255、255、22、255、255、255、22、14、14、255、255、255、255、255、2、)
#格式化日期时间
df['CREATED_DATE']=df['CREATED_DATE'].应用(lambda x:x.to_pydatetime().strftime(“%Y%m%d%H%m%S”))
df['LAST_MODIFIED_DATE']=df['LAST_MODIFIED_DATE'].应用(lambda x:x.to_pydatetime().strftime(“%Y%m%d%H%m%S”))
df['TERMS_ACCEPTED_DATE']=df['TERMS_ACCEPTED_DATE'].应用(lambda x:x.to_pydatetime().strftime(“%Y%m%d%H%m%S”))
df['PRIVACY_ACCEPTED_DATE']=df['PRIVACY_ACCEPTED_DATE']。应用(lambda x:x.to_pydatetime().strftime(“%Y%m%d%H%m%S”))
#打印(键入(df.iloc[0]['CREATED_DATE']))
#打印(df.iloc[0])
记录行列表=[]
#对于df.iloc[:10].itertuples()中的行:
对于[df.to_记录中x的元组(x)中的行(index=False)]:
记录行列表。追加(“.”连接(左对齐列(长度,值)表示长度,zip中的值(宽度,行)))
将open('output.txt','w')作为f:
f、 写入('\n'.join(记录行列表))

看看
to_string
方法,看看你是否可以做你想做的事情。这看起来很接近。如果任意两个float或string列具有不同的格式,我似乎必须为每个列提供一个格式化程序函数。这样就行了,只是看起来有点笨拙。我希望我错过了什么。谢谢pandas df.to_csv有一个sep=“”参数,该参数将逗号更改为其他任何字符(在本例中为空格或空字符串)。与方法的格式化程序一起使用应该可以做到这一点。@Joop实际上与
df.to_csv()
方法一起使用空字符串作为分隔符会产生错误
TypeError:delimiter必须设置
.true。。将空字符串传递给方法会造成混乱,请不要忽略对空字符串的引用。也许尝试熊猫“tou_string”方法会有所帮助。如果有格式化程序参数,这是非常好的工作为我优雅。这比
tablate
要好,因为pandas中包含numpy,所以不需要额外的库
with open('output.dat') as ofile:
     fmt = '%.0f %02.0f %4.1f %3.0f %4.0f %4.1f %4.0f %4.1f %4.0f'
     np.savetxt(ofile, df.values, fmt=fmt)
 with open (FilePath,'w') as f:
    for i in finalDataFrame.values.tolist():
        widths=(0,0,0,0,0,0,0)
        if i[2] == 'nan':
            i[2]=''
            for h in range(7):
                i[2]= i[2] + ' '
        else:
            x=7-len(str(i[2]))
            a=''
            for k in range(x):
               a=a+' '
            i[2]=str(i[2])+a

        if i[3] == '':
            i[3]=''
            for h in range(25):
                i[3]=i[3]+' '
        else:
            x = 25 - len(i[3])
            print(x)
            a = ''
            for k in range(x):
                a = a + ' '
            print(a)
            i[3] = i[3] + a


        i[4] = str(i[4])[:10]

        q="".join("%*s" % i for i in zip(widths, i))
        f.write(q+'\n')
import pandas as pd
import pickle
import numpy as np
from tabulate import tabulate


left_align_gen = lambda length, value: eval(r"'{:<<<length>>}'.format('''<<value>>'''[0:<<length>>])".replace('<<length>>', str(length)).replace('<<value>>', str(value)))
right_align_gen = lambda length, value: eval(r"'{:><<length>>}'.format('''<<value>>'''[0:<<length>>])".replace('<<length>>', str(length)).replace('<<value>>', str(value)))

# df = pd.read_pickle("dummy.pkl")
with open("df.pkl", 'rb') as f:
    df = pickle.load(f)

# field width defines here, width of each field
widths=(22, 255, 14, 255, 14, 255, 255, 255, 255, 255, 255, 22, 255, 22, 255, 255, 255, 22, 14, 14, 255, 255, 255, 2, )

# format datetime
df['CREATED_DATE'] = df['CREATED_DATE'].apply(lambda x: x.to_pydatetime().strftime('%Y%m%d%H%M%S'))
df['LAST_MODIFIED_DATE'] = df['LAST_MODIFIED_DATE'].apply(lambda x: x.to_pydatetime().strftime('%Y%m%d%H%M%S'))
df['TERMS_ACCEPTED_DATE'] = df['TERMS_ACCEPTED_DATE'].apply(lambda x: x.to_pydatetime().strftime('%Y%m%d%H%M%S'))
df['PRIVACY_ACCEPTED_DATE'] = df['PRIVACY_ACCEPTED_DATE'].apply(lambda x: x.to_pydatetime().strftime('%Y%m%d%H%M%S'))


# print(type(df.iloc[0]['CREATED_DATE']))
# print(df.iloc[0])
record_line_list = []
# for row in df.iloc[:10].itertuples():
for row in [tuple(x) for x in df.to_records(index=False)]:
    record_line_list.append("".join(left_align_gen(length, value) for length, value in zip(widths, row)))

with open('output.txt', 'w') as f:
    f.write('\n'.join(record_line_list))