【问题标题】:Limit columns of CSV read into dataframe based on first rows根据第一行限制 CSV 列读入数据帧
【发布时间】:2020-11-18 13:16:12
【问题描述】:

我有一个包含可变列数的行的 CSV(实际上是制表符分隔的)。前几行的长度相同,比如x,随后的行是可变的(通常更长,比如y)。

我想将此文件读入 pandas 数据帧,其中列数 = 前几行的长度,即 x 列,以及后面的行,包括高达 x 列的值和之后删除那些。

pd.read_csv 命令中是否有一种优雅的方式来执行此操作?

我曾尝试使用error_bad_lines=False,但这会导致后面的行被删除,而我需要在 col x 处截断它们。请注意,我不提前知道x 是什么,所以也不能简单地对其进行硬编码。

编辑 - 当然这是一个截断的例子 - 这里前几行有 6 个值,最后两行有 10 个值:

Time    0   1   2   3   4   5
alpha   1.35393 1.35393 1.35393 1.35393 1.35393 1.35393
dn  0.015   0.015   0.015   0.015   0.015   0.015
Mu  16.3012 16.3012 16.3012 16.3012 16.3012 16.3012
roll    114.29  114.29  114.29  114.29  114.29  114.29  114.29  114.29  114.29  114.29
timesens    50  50  50  50  50  50  50  50  50  50

我想要一个包含 0:6 的所有行和列的数据框。

【问题讨论】:

  • 请显示原始文本文件

标签: python pandas dataframe


【解决方案1】:

我将您的示例数据放入data1.csv 并使用以下内容。基本上将每一行作为单独的数据帧读取,然后连接在一起

from io import StringIO
dfs = []
with open('data1.csv') as f:
    for line in f:
        io_string = StringIO(line)
        df = pd.read_csv(io_string, delim_whitespace=True, header = None)
        dfs.append(df)

whole_df = pd.concat(dfs).reset_index(drop = True)
whole_df

生产


|    | 0        |         1 |         2 |         3 |         4 |         5 |         6 |      7 |      8 |      9 |     10 |
|---:|:---------|----------:|----------:|----------:|----------:|----------:|----------:|-------:|-------:|-------:|-------:|
|  0 | Time     |   0       |   1       |   2       |   3       |   4       |   5       | nan    | nan    | nan    | nan    |
|  1 | alpha    |   1.35393 |   1.35393 |   1.35393 |   1.35393 |   1.35393 |   1.35393 | nan    | nan    | nan    | nan    |
|  2 | dn       |   0.015   |   0.015   |   0.015   |   0.015   |   0.015   |   0.015   | nan    | nan    | nan    | nan    |
|  3 | Mu       |  16.3012  |  16.3012  |  16.3012  |  16.3012  |  16.3012  |  16.3012  | nan    | nan    | nan    | nan    |
|  4 | roll     | 114.29    | 114.29    | 114.29    | 114.29    | 114.29    | 114.29    | 114.29 | 114.29 | 114.29 | 114.29 |
|  5 | timesens |  50       |  50       |  50       |  50       |  50       |  50       |  50    |  50    |  50    |  50    |

nans 对于x 之后的列,如果您愿意,可以在获得 df 后进行后处理以删除这些列:

whole_df.dropna(axis=1)

【讨论】:

  • 哇。谢谢。这行得通,但肯定有更有效的方法来做到这一点......?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多