在csv文件中添加填充以使熊猫可读数据框

时间:2019-02-20 16:39:26

标签: python pandas csv padding

我在csv文件中有几个数据(相似的数据结构,但不相同),某些行的行和列大小不同。

例如,每个csv文件的前三行具有变化的列数,即:

----------------
Table | Format |
----------------
Code  | Label  | Index  |
-----------------------------------------
  a   |   b    |   c    |   d   |   e   |
-----------------------------------------

看起来很难看,并且很难像熊猫一样读入。

我想制作表格,使其能够识别文件中列的最大长度,并在空白处添加任何填充以使尺寸相等。 即。

-----------------------------------------
Table | Format |  pad   |  pad  |  pad  |
-----------------------------------------
Code  | Label  | Index  |  pad  |  pad  |
-----------------------------------------
  a   |   b    |   c    |   d   |   e   |
-----------------------------------------

到目前为止,我研究了读取熊猫并将标头添加到csv文件中的问题,但是由于每个csv文件的最大列数各不相同,因此我一直处于困境。

任何帮助或指针将不胜感激!

2 个答案:

答案 0 :(得分:1)

如果列分隔符是逗号,则只需在每行的末尾插入适当数量的逗号即可进行填充。使用read_csv熊猫将以NaN格式读取填充的值。

with open('/path/to/data.csv', 'r') as f:
    data = f.read().split()

# Count the the number of columns in each line
cols = [row.count(',')+1 for row in data]
# Find the widest row
max_cols = max(cols)

# Loop over lines in text
for id, row in enumerate(data):
    # Pad extra columns when necessary
    if cols[id] < max_cols:
        data[id] += (max_cols - cols[id]) * ','

# Write the data out
with open('/path/to/pad_data.csv', 'w') as f:
    f.write('\n'.join(data))

设置一些测试数据:

data = '1,2,3\n4,\n5,6,7,8,9\n'
print(data)
#1,2,3
#4,
#5,6,7,8,9

应用上述方法可以得出:

print('\n'.join(pad_data))
#1,2,3,,
#4,,,,
#5,6,7,8,9

答案 1 :(得分:1)

这是我写的一个小脚本,用于填充从pandas数据框派生的列。我的文件是中间文件,以竖线分隔:

INPUT_FILE = r'blah.txt'
OUTPUT_FILE = r'blah.TAB'

col_widths = []
with open(INPUT_FILE, "r") as fi:
    line = fi.readline()
    headers = line.split(sep='|')
    for h in headers:
        col_widths.append(len(h))

with open(INPUT_FILE) as fi:
    line = fi.readline()
    while line:
        cols = line.split(sep='|')
        line = fi.readline()
        index = 0
        for c in cols:
            if len(c) > col_widths[index]:
                col_widths[index] = len(c)
            index += 1

with open(INPUT_FILE) as fi:
    fo = open(OUTPUT_FILE, 'w')
    line = fi.readline()
    while line:
        tokens = line.split(sep='|')
        index = 0
        for t in tokens:
            if index == len(col_widths) - 1:
                t = t.rstrip('\r\n')
            ft = '{:<' + str(col_widths[index]) + '}'
            v = ft.format(t)
            fo.write(v + '|')
            index += 1
        fo.write('\r')
        line = fi.readline()
    fo.close()