【问题标题】:Pandas: Read skipping lines that starts with a certain stringPandas:读取以某个字符串开头的跳过行
【发布时间】:2023-03-27 04:55:01
【问题描述】:

我有一个这样的 Pandas DataFrame:

[6 rows x 5 columns]
name     timestamp         value1  state         value2
Cs01  1.514483e+09         19.516      0  9.999954e-01   
Cs02  1.514483e+09         20.055      0  9.999363e-01   
Cs03  1.514483e+09         20.054      0  9.999970e-01   
Cs01  1.514483e+09         20.055      0  9.999949e-01   
Cs01  1.514483e+09         10.907      0  9.963121e-01   
Cs02  1.514483e+09         10.092      0  1.548312e-02  

read_csv 函数是否可以跳过所有不以名称“Cs01”开头的行?

谢谢

【问题讨论】:

  • 如果您可以包含所需的输出,这将很有用,因为您的问题在第一次阅读时会有些混乱
  • 正是你所做的。谢谢

标签: python pandas python-3.5


【解决方案1】:

一种方法是分块读取文件,然后过滤掉块中的行,如果您有一个包含大量不需要的行的大文件作为读取整个 df 然后过滤,这可能会更快可能表现不佳:

In[17]:
t="""name     timestamp         value1  state         value2
Cs01  1.514483e+09         19.516      0  9.999954e-01   
Cs02  1.514483e+09         20.055      0  9.999363e-01   
Cs03  1.514483e+09         20.054      0  9.999970e-01   
Cs01  1.514483e+09         20.055      0  9.999949e-01   
Cs01  1.514483e+09         10.907      0  9.963121e-01   
Cs02  1.514483e+09         10.092      0  1.548312e-02"""
d = pd.read_csv(io.StringIO(t), delim_whitespace=True, chunksize=2)
dfs = pd.concat([x[x['name'].str.startswith('Cs01')] for x in d])
dfs

Out[17]: 
   name     timestamp  value1  state    value2
0  Cs01  1.514483e+09  19.516      0  0.999995
3  Cs01  1.514483e+09  20.055      0  0.999995
4  Cs01  1.514483e+09  10.907      0  0.996312

这里chunksize 参数指定要读取的行数,您可以将其设置为任意大小,然后对每个块进行列表理解和过滤,然后调用concat 生成单个df

【讨论】:

  • 投反对票,因为不清楚这个答案是什么意思。
  • @Andre 你不明白什么? Chunksize 将在每次迭代中读取特定数量的行,因此它返回一个 df,每个 df 块被过滤并附加到一个列表中,然后连接起来。大多数pandas 用户都明白这一点
【解决方案2】:

最简单的就是过滤所有行:

df = pd.read_csv('file')

df = df[df['name'].str.startswith('Cs01')]
print (df)
   name     timestamp  value1  state    value2
0  Cs01  1.514483e+09  19.516      0  0.999995
3  Cs01  1.514483e+09  20.055      0  0.999995
4  Cs01  1.514483e+09  10.907      0  0.996312

另一种解决方案是在预处理中获取所有不包含Cs01 的行,并在read_csv 中使用参数skiprows

exclude = [i for i, line in enumerate(open('file.csv')) if not line.startswith('Cs01')]
print (exclude)
[0, 2, 3, 6]

df = pd.read_csv('file.csv', skiprows = exclude[1:])
print (df)
   name     timestamp  value1  state    value2
0  Cs01  1.514483e+09  19.516      0  0.999995
1  Cs01  1.514483e+09  20.055      0  0.999995
2  Cs01  1.514483e+09  10.907      0  0.996312

【讨论】:

    猜你喜欢
    • 2014-12-02
    • 1970-01-01
    • 2020-05-11
    • 2013-09-26
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    相关资源
    最近更新 更多