如何从.csv文件中提取特定行并写入另一个文件

时间:2017-12-08 23:17:43

标签: python pandas csv numpy anaconda

我的.csv文件是这样的:

x,   y,   z  
1,  10,   45 
2,   0,   34
4,  15,   34
5,  99,   38
6,  13,   23
5,  99,   38
6,  13,   23
.    .     .
1000, 234, 678

现在我想写出列x的行,这可以通过5表格来建议.csv文件。

以下是有关该文件的更多详细信息:

x,                  y
0.0000123219872323, 1.213
.                     .
4.991414887967266,  8.123
4.996324047550014,  2.323
5.000581861276573,  6.234
5.006295444400881,  9.234
5.029657671211434,  1.219
5.034806828096650,  1.123
.                   .
9.997414351064347,  1.345
10.00211537343025,  1.232
10.00675672507283,  2.234
10.01201110041457,  1.003
.                   .

这是我想要处理的真实文件。我必须从此.csv文件中提取行。特别是,列值的行可以被5分割。

我的输出应如下所示:

5.000581861276573,  6.234
10.00211537343025,  1.232

不是5,10等值的两倍。提取一个5值后, 它应该被5整除,在这种情况下它应该是10.

4 个答案:

答案 0 :(得分:2)

如果你想写出每个第5行,你可以简单地做

df.iloc[::5, :].to_csv('file_name.csv')

其中df是像这样创建的pandas数据框:

import pandas as pd
df = pd.read_csv('input.csv')

否则,您也可以

# define all indexes here
out_rows = [1, 5]

df.iloc[out_rows, :].to_csv('file_name.csv')

您需要更详细地说明您想要达到的目标,然后我们可以提供更好的帮助。

编辑:

据我所知,您希望根据接近某些值的浮点数进行选择。这可能有点hacky并且还假设您不会遗漏整数(这似乎是基于您对值的描述的合理假设):

假设您的df看起来像这样(替换为实际数据):

          x,  y
0   0.955425  1
1   0.602229  2
2   1.520194  6
3   1.748095  1
4   2.422760  0
5   2.051359  6
6   3.268572  9
7   3.981412  1
8   4.687532  0
9   4.215138  8
10  5.029877  7
11  5.197888  7
12  6.795040  1
13  6.452637  0
14  7.413032  8
15  7.127841  5
16  8.597014  7
17  8.002060  8
18  9.713273  3
19  9.912318  7

如上所述,首先根据x,

对值进行排序
df = df.sort_values('x,')

          x,  y
1   0.602229  2
0   0.955425  1
2   1.520194  6
3   1.748095  1
5   2.051359  6
4   2.422760  0
6   3.268572  9
7   3.981412  1
9   4.215138  8
8   4.687532  0
10  5.029877  7
11  5.197888  7
13  6.452637  0
12  6.795040  1
15  7.127841  5
14  7.413032  8
17  8.002060  8
16  8.597014  7
18  9.713273  3
19  9.912318  7

然后添加一个帮助列,floor

中的值为x,
df['helper'] = df['x,'].apply(np.floor).astype(int)

          x,  y  helper
1   0.602229  2       0
0   0.955425  1       0
2   1.520194  6       1
3   1.748095  1       1
5   2.051359  6       2
4   2.422760  0       2
6   3.268572  9       3
7   3.981412  1       3
9   4.215138  8       4
8   4.687532  0       4
10  5.029877  7       5
11  5.197888  7       5
13  6.452637  0       6
12  6.795040  1       6
15  7.127841  5       7
14  7.413032  8       7
17  8.002060  8       8
16  8.597014  7       8
18  9.713273  3       9
19  9.912318  7       9

现在删除重复项helper

df = df.drop_duplicates('helper')

          x,  y  helper
1   0.602229  2       0
2   1.520194  6       1
5   2.051359  6       2
6   3.268572  9       3
9   4.215138  8       4
10  5.029877  7       5
13  6.452637  0       6
15  7.127841  5       7
17  8.002060  8       8
18  9.713273  3       9

并导出解决方案:

df.iloc[::5, :].drop('helper', axis=1)

          x,  y
1   0.602229  2
10  5.029877  7

答案 1 :(得分:0)

您的答案非常广泛,需要更多解释。它也可能已在StackOverflow上的其他帖子中得到解答。

您问题的一个非常基本的答案:

to_print = [1, 5, 10, 1000]

with open('input_file.csv', 'r') as fr:
    with open('write_here.csv', 'w') as fw:
        for i, row in enumerate(fr):
            if i in to_print:
                 fw.write(row)

这只是将您在to_print中指定的每一行写入另一个csv文件。

如果您要打印0到1000之间的每隔五行,您可以考虑设置to_print = range(0, 1000, 5),或者,如果您不知道文件的行数:

with open('input_file.csv', 'r') as fr:
    with open('write_here.csv', 'w') as fw:
        for i, row in enumerate(fr):
            if i % 5 == 0:
                 fw.write(row)

答案 2 :(得分:0)

archive_in = open('lines.txt', 'r')
archive_out = open('out.txt', 'w')
i = 0
for line in archive_in.readlines():
    i += 1
    if i == 2:
        archive_out.write(line)
        i = 3
    elif i == 7:
        archive_out.write(line)
        i = 2

archive_in.close()
archive_out.close()

编辑,现在写入具有最接近值的行来列出输入。

import pandas as pd

df = pd.read_csv('lines.txt', header=None)
archive_out = open('out.txt', 'w')
inputs = (1, 5, 10)

for input in inputs:

    archive_out.write(str(df.ix[(df[0] - input).abs().argsort()[:1]].values[0])[1:-1].strip() + '\n')

archive_out.close()

答案 3 :(得分:0)

使用pandas库的粗略示例,该库将csv转换为数据帧。

import pandas as pd

df = pd.read_csv('asdf.csv')
for i in range(200+1):
     df.iloc[i*5]

这假设你想要进入5的