删除"未命名:#"使用pandas

时间:2015-07-09 18:24:40

标签: python csv pandas

我有一个CSV文件,我每天都会从网站上删除的某些数据进行更新。该文件的格式并不理想,但遗憾的是还有其他依赖项,因此我无法改变数字格式化的方式。我正在阅读我每天已经拥有的CSV,然后在信息发布时用每个新的一天的数据更新它。该文件的格式如下:

2015-06-29|         |  2015-06-28|         |  2015-06-27|         ...
col1      |  col2   |  col1      |  col2   |  col1      |  col2
10        |  3      |  103.4     |  6.6    |  103.2     |  4.3
1028      |  5      |  102.4     |  6.2    |  103.3     |  2.2
90        |  6      |  91.7      |  5.0    |  93.1      |  2.4
105       |  1      |  100.8     |  5.5    |  100.9     |  1.7
345       |  7      |  103.0     |  6.1    |  102.9     |  6.3
53        |  3      |  106.0     |  8.6    |  105.3     |  7.6
110       |  5      |  113.0     |  9.1    |  110.9     |  6.7
32        |  4      |  3.9       |  1.8    |  3.5       |  2.9
...

当新的一天到来时,我将在单独的Pan​​das数据帧中保存以下内容:

2015-06-30|        
col1      |  col2 
1         |  3     
28        |  5     
901       |  6     
15        |  1     
45        |  7      
533       |  3     
15        |  5  
75        |  4     

我只是想在最近的条目的左边插入这两行,然后保存在上一个文件中。我没有遇到任何麻烦,但我得到的是"未命名:#"在日期旁边的列中,而不是像这样的空单元格:

2015-06-29|         |  2015-06-28|  unnamed:0      |  2015-06-27| unnamed:1
col1      |  col2   |  col1      |  col2           |  col1      |  col2
10        |  3      |  103.4     |  6.6            |  103.2     |  4.3
1028      |  5      |  102.4     |  6.2            |  103.3     |  2.2
90        |  6      |  91.7      |  5.0            |  93.1      |  2.4
105       |  1      |  100.8     |  5.5            |  100.9     |  1.7
345       |  7      |  103.0     |  6.1            |  102.9     |  6.3
53        |  3      |  106.0     |  8.6            |  105.3     |  7.6
110       |  5      |  113.0     |  9.1            |  110.9     |  6.7
32        |  4      |  3.9       |  1.8            |  3.5       |  2.9

如何摆脱这些细胞值并保留空细胞呢?

1 个答案:

答案 0 :(得分:4)

如果您使用header=None阅读CSV,则空单元格会被NaN填充,而不是"Unnamed:X"

df = pd.read_table('data', sep='\s*[|]\s*', header=None)
#             0     1           2     3           4     5
# 0  2015-06-29   NaN  2015-06-28   NaN  2015-06-27   NaN
# 1        col1  col2        col1  col2        col1  col2
# 2          10     3       103.4   6.6       103.2   4.3
# ...

然后,您可以从数据帧的其余部分切割前两行:

    columns = df.iloc[:2]
    df = df.iloc[2:]

通过调用NaN

替换空字符串fillna
    columns = columns.fillna('')

然后将列设为MultiIndex:

    columns = pd.MultiIndex.from_arrays(columns.values.tolist())
    df.columns = columns

例如,如果data有内容

2015-06-29|         |  2015-06-28|         |  2015-06-27|         
col1      |  col2   |  col1      |  col2   |  col1      |  col2
10        |  3      |  103.4     |  6.6    |  103.2     |  4.3
1028      |  5      |  102.4     |  6.2    |  103.3     |  2.2
90        |  6      |  91.7      |  5.0    |  93.1      |  2.4
105       |  1      |  100.8     |  5.5    |  100.9     |  1.7
345       |  7      |  103.0     |  6.1    |  102.9     |  6.3
53        |  3      |  106.0     |  8.6    |  105.3     |  7.6
110       |  5      |  113.0     |  9.1    |  110.9     |  6.7
32        |  4      |  3.9       |  1.8    |  3.5       |  2.9

data2有内容

2015-06-30|        
col1      |  col2 
1         |  3     
28        |  5     
901       |  6     
15        |  1     
45        |  7      
533       |  3     
15        |  5  
75        |  4     

然后

import pandas as pd

def read_multiheader(filepath_or_buffer, num_header_rows=2, encoding=None):
    from pandas.io.common import get_filepath_or_buffer
    filepath_or_buffer, _ = get_filepath_or_buffer(filepath_or_buffer, encoding)
    df = pd.read_table(filepath_or_buffer, sep='\s*[|]\s*', header=None)
    columns = df.iloc[:num_header_rows]
    columns = columns.fillna('')
    columns = pd.MultiIndex.from_arrays(columns.values.tolist())
    df = df.iloc[num_header_rows:]
    df.columns = columns
    return df

df = read_multiheader('data')
df2 = read_multiheader('data2')
newdf = pd.concat([df2, df], axis=1)
print(newdf)

产量

  2015-06-30      2015-06-29      2015-06-28      2015-06-27     
        col1 col2       col1 col2       col1 col2       col1 col2
2          1    3         10    3      103.4  6.6      103.2  4.3
3         28    5       1028    5      102.4  6.2      103.3  2.2
4        901    6         90    6       91.7  5.0       93.1  2.4
5         15    1        105    1      100.8  5.5      100.9  1.7
6         45    7        345    7      103.0  6.1      102.9  6.3
7        533    3         53    3      106.0  8.6      105.3  7.6
8         15    5        110    5      113.0  9.1      110.9  6.7
9         75    4         32    4        3.9  1.8        3.5  2.9