python - 在 pandas-python 中或制表 : how to set FIXED column width?

标签 python pandas csv dataframe file-writing

我正在使用 pandas 创建数据帧,然后使用 tabulate 包将它们写入 .txt 文件。但我需要 .txt 表的列恰好 11 个字符宽度(我需要这样做,因为 .txt 稍后由仅读取固定宽度列的 fortran 程序读取)。我在 pandas 或 tabulate 包中找不到用于设置表列宽度的选项。我读到了有关 pandas.set_option('display.max_colwidth',100) 的内容,但这仅设置了最大宽度,而不是固定宽度,并且它用于显示,而不是用于写入到文件中。

有人知道设置宽度的选项吗?或者也许有一个可以制表的替代包,可以实现这一点?

<小时/>

根据 @zipa 的答案中的说明解决方案:

输出现在确实在宽度 = 11 个字符的列中,但在右侧的第 5 列中,可以看到这被破坏了 - 因为 float <10e+11 以十进制表示法表示,而不是以指数/科学表示。这是由 str(x) 引起的

看到这里,检查右起第五列:

C_2_       ,nan        ,nan        ,nan        ,nan        , C         , C         ,nan        ,nan        ,nan        ,2.49e-08   ,0.0        ,71600      ,2          ,100        ,6.01e+11   ,-1.0       ,71600      ,2          ,100        
CH         ,nan        ,nan        ,nan        ,nan        , C         , H         ,nan        ,nan        ,nan        ,3.16e-10   ,0.0        ,33700      ,2          ,100        ,7630000000.0,-1.0       ,33700      ,2          ,100        
CN         ,nan        ,nan        ,nan        ,nan        , C         , N         ,nan        ,nan        ,nan        ,1e-09      ,0.0        ,71000      ,2          ,100        ,24200000000.0,0.0        ,71000      ,2          ,100        
CO         ,nan        ,nan        ,nan        ,nan        , C         , O         ,nan        ,nan        ,nan        ,0.000152   ,-3.1       ,12900      ,2          ,100        ,3.67e+15   ,-4.1       ,12900      ,2          ,100 

为了首先解决这个问题,我将“nan”变成了空白空间: df.fillna(' ',inplace=True)。接下来,我按照 @zipa 后来的评论并更改了他建议的代码中的一行 - 我使 lambda 函数采用和 if 子句,并且根据条目是字符串还是 float 而具有不同的行为:

df = df.applymap(lambda x: str(x).ljust(11) if type(x)==str else str('{:.3e}'.format(x)).ljust(11))

这解决了我的问题! - 请参阅下面的输出:

C2         ,           ,           ,           ,           , C         , C         ,           ,           ,           ,2.490e-08  ,0.000e+00  ,7.160e+04  ,2.000e+00  ,1.000e+02  ,6.010e+11  ,-1.000e+00 ,7.160e+04  ,2.000e+00  ,1.000e+02  
CH         ,           ,           ,           ,           , C         , H         ,           ,           ,           ,3.160e-10  ,0.000e+00  ,3.370e+04  ,2.000e+00  ,1.000e+02  ,7.630e+09  ,-1.000e+00 ,3.370e+04  ,2.000e+00  ,1.000e+02  
CN         ,           ,           ,           ,           , C         , N         ,           ,           ,           ,1.000e-09  ,0.000e+00  ,7.100e+04  ,2.000e+00  ,1.000e+02  ,2.420e+10  ,0.000e+00  ,7.100e+04  ,2.000e+00  ,1.000e+02  
CO         ,           ,           ,           ,           , C         , O         ,           ,           ,           ,1.520e-04  ,-3.100e+00 ,1.290e+04  ,2.000e+00  ,1.000e+02  ,3.670e+15  ,-4.100e+00 ,1.290e+04  ,2.000e+00  ,1.000e+02  

最佳答案

嗯,这可能是您所需要的,它会将所有内容转换为 11 个字符长的文本:

import pandas as pd

df = pd.DataFrame({'a': [12345, 2, 3], 'b': list('ABC')})
df = df.applymap(lambda x: str(x).ljust(11))
df.columns = df.columns.map(lambda x: str(x).ljust(11))
df.to_csv('somefile.txt', index=False)

关于python - 在 pandas-python 中或制表 : how to set FIXED column width?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46097855/

相关文章:

python - 在 Python 中使用 EyeD3 设置 ID3 注释

python - 递归 pyinotify 监视阻止子目录被删除

python - Pandas:检查列中是否存在一个值,创建一个新列,存在加1,不存在加0

python - 让 csv.reader 告诉它什么时候在最后一行

python - 如何使用 pandas 从 csv 的 2 列中获取重复值的列表

python - 值错误 : invalid literal for int() with base 10: b'1\n5\n'

python - 如何生成随机数列表,使它们的总和等于随机选择的数字

python - 根据第三个变量中的多个条件,在数据框中为多个子组创建一个新变量

python - 获取连续n次出现的值

java - 在 Java 中创建大型 csv 文件变得非常慢