【问题标题】:How do I extract the particular row from .csv file and write out in to another file [closed]如何从 .csv 文件中提取特定行并写入另一个文件 [关闭]
【发布时间】:2018-05-23 05:44:59
【问题描述】:

我有类似这样的 .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 列的行,这可以从这个 .csv 文件中写出 5。

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

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。

【问题讨论】:

  • 您想每 5 行采样一次,从第一行开始,到第 1000 行停止,然后将其写入另一个文件?
  • 如果您的 x 列确实是浮点数,那么您很少会真正找到 5 的倍数,除非您的意思是“在 1% 的容差范围内”(在这种情况下,您需要指定)。 (顺便说一句:我推断“可分割”副“可取”。)无论如何,如果您再次提出这个(或类似)问题,我建议您添加您实际尝试过的代码; SO 并不意味着是“免费为我写这个”服务,因此它有助于展示您尝试过的努力。它还为您的预期流程提供了进一步的背景信息。
  • 为什么要包含5.000581861276573 而不是5.006295444400881
  • Manu!:这只是一个例子,是的,我只想包括接近 5 的一楼值。

标签: python pandas csv numpy anaconda


【解决方案1】:

如果你想写出每 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')

您需要更详细地指定您想要达到的目标,然后我们才能提供更好的帮助。

编辑:

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

假设您的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

然后在floorx, 中的值添加一个帮助器列

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

【讨论】:

  • 谢谢!如果我的列是浮点值而不是 int 怎么办。
  • @Mathi:我不明白你的问题。我认为这是关于选择行而不是列?我以为您在谈论索引;在这种情况下,你认为花车是什么意思还是我误解了?
  • 我的第一列值从 0 开始,它会通过添加 0.001(类似的东西)增长到 N。在列中,我需要提取至少接近 5、10、15、20 等的行。我该怎么做?
  • 它不工作,我遇到了一些错误。
  • @Mathi:什么错误?确保使用正确的列名...
【解决方案2】:
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()

【讨论】:

  • 谢谢!我想要这样的东西,你能告诉我当列值是浮点数时该怎么做,我只需要接近 5、10、15 等的行。
  • 但是那你不找位置,找变量X的值
  • 我想我需要将第一列中的那些值从浮点数更改为 int 并将它们提取为 5,10,15 等等
【解决方案3】:

您的答案非常广泛,需要更多解释。 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)

【讨论】:

  • 谢谢!你能告诉我当列值在浮动时如何提取更接近 5、10、15 的行。
  • Manu!:我现在已经编辑了我的问题,您现在可以帮助我吗?
【解决方案4】:

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

import pandas as pd

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

这是假设你想在 5 秒内上升

【讨论】:

  • 谢谢!我想准确提取接近 5、10、15、20、25 等的列值。
  • Peach!:我现在已经编辑了我的问题,现在可以帮助我吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
相关资源
最近更新 更多