Pandas 在每个\n换行符中将文本文件拆分为多个数据集

Pandas 在每个\n换行符中将文本文件拆分为多个数据集,pandas,dataframe,split,Pandas,Dataframe,Split,我有一个文本文件,textfile.qdp: 要跳过的行1 要跳过的行2 要跳过的行3 1.25 0.6499976 2.24733017E-2 2.07460159E-3 3.01663446 1.89463757E-2 1.48296626E-2 2.98285842 2.0999990.199999888 7.33829737E-26.63989689E-3.48941302 3.8440533E-2 6.34965161E-3 3.44462299 2.5 0.20000048 0.11

我有一个文本文件,
textfile.qdp

要跳过的行1
要跳过的行2
要跳过的行3
1.25 0.6499976 2.24733017E-2 2.07460159E-3 3.01663446 1.89463757E-2 1.48296626E-2 2.98285842
2.0999990.199999888 7.33829737E-26.63989689E-3.48941302 3.8440533E-2 6.34965161E-3 3.44462299
2.5 0.20000048 0.118000358.37391801E-3 2.64556909 3.93543094E-2 6.16234308E-3 2.60005236
2.900000100.19999928 0.145619139 9.26280301E-3 2.56852388 4.85827066E-2 6.0398886E-3 2.51390147
3.2999995 0.20000048 0.167878062 9.94068757E-3 2.46484375 5.69529012E-2 6.81256084E-3 2.40107822
3.700000500.20000048 0.175842062 1.01562217E-2.28405786.24930188E-2 8.10874719E-3 2.21345592
4.10000038 0.20000048 0.181325018 1.03028165E-2 2.02467489 6.38177395E-2 1.2183371E-2 1.94867384
4.5 0.199999809 0.1575462079.59824398E-3 1.76375055 6.11177757E-2 6.072836E-2 1.64190447
4.9499981 0.25 0.156071638.54758453E-3 1.51925421 5.52904457E-2 0.149736568 1.3142271
5.5 0.300000191 0.125403479 6.9860979E-3 1.52551162 4.61589135E-2 0.511757791 0.967594922
6.10000038 0.29999952 9.54503566E-2 6.10219687E-3 3.56054449 3.59460302E-2 2.85172343 0.672874987
6.86499977 0.464999914 5.7642214E-23.80936684E-34.10104704 2.42055673E-23.67026114 0.406580269
8.289996 0.960000038 2.10143197E-2 1.60136714E-3 0.142320022 8.9181494E-3 6.96837786E-4 0.132705033
9.48999977 0.23999771 5.72929019E-3 1.6677354E-3 3.82030606E-2.56266794E-3 4.94769251E-4 3.5145625E-2
4.139999871.999999809E-2.47749758 4.67826687E-2 30.4350224 0.973279834 0.754008532 28.7077332
4.17999983 1.999999809E-2 2.44065595 4.64052781E-2 30.5456734 0.99132967 0.677066088 28.8772774
4.219999791.999990909E-2.4736743 4.67251018E-2 30.8877811 1.01084304 0.807663918 29.0692749
4.26000023 2.00002193E-2 2.48481822 4.68727946E-2 30.9508438 1.02374947 0.834929705 29.092165
4.30000019 1.99999809E-2 2.54010344 4.73690033E-2 31.119503 1.03903878 0.93061626 29.1498489
4.3400015 1.99999809E-2 2.49571872 4.69326451E-2 31.1599998 1.05370748 0.892735004 29.2135563
4.38000011 1.99999809E-2 2.58409572 4.77907397E-2 31.367794 1.06788957 1.05168498 29.2482204
4.42000008 1.99999809E-2 2.6437602 4.83172201E-2 31.5764256 1.08456081.140239629.3516254
4.46000004 1.9999809E-2 2.65394902 4.84031737E-2 31.5579567 1.09554553 1.1519351 29.3104763
4.5 1.999990909E-2 2.62269425 4.81106751E-2 31.644083 1.11161876 1.12954116 29.4029236
每列都是一个不同的参数值,文本文件包括几个数据集,最后我想用不同的颜色进行打印。文本文件中的新行标记不同的集合

import pandas as pd
import matplotlib as plt

names = ['e', 'de', 'y', 'y_err', 'total', 'model1', 'model2', 'model3']
for j in range(8):
    names.append('model%i' %j)
df = pd.read_table('textfile.qdp', skiprows=3, names=names, delimiter=' ', skip_blank_lines=True)

fig, ax = plt.subplots(figsize=(10, 6))
ax.errorbar(df.e, df.y, xerr=df.de, yerr=df.y_err, fmt='o', label='data') # Here I want to plot different dfs
我该如何处理熊猫呢?我认为这与以下方面有关:


但我不确定这是如何用
read_table
翻译的(也就是
*dat
返回
无效语法
)。

您可以这样做:

首先是基础知识(请注意,您应该调用matplotlib.pyplot而不是matplotlib,以便在末尾访问.subPlot函数):

保存read_表的参数:

kwargs = {
        "names":names,
        "delimiter":' ',
        "skip_blank_lines":True
        }
读取并存储文件内容,跳过不需要的行:

skiprows=3
with open('textfile.qdp') as f:
    collect_lines_as_list = f.readlines()
    selected_lines = collect_lines_as_list[skiprows:]
    content = "".join(selected_lines) # Join all lines to get one string only
然后在空行(即连续两行返回)上拆分内容,并将其存储在临时StringIO中,以重新创建Pandas将管理的对象。使用听写理解(与您链接的另一个答案完全相同),您可以一次性收集所有数据:

dfs = {
    k: pd.read_table(io.StringIO(data), **kwargs)
    for k, data
    in enumerate(content.split('\n\n'))
}
以您想要的方式绘制数据帧(通过迭代dict值):

你会得到这样的结果:

fig, ax = plt.subplots(figsize=(10, 6))
for df in dfs.values():
    ax.errorbar(df.e, df.y, xerr=df.de, yerr=df.y_err, fmt='o', label='data')
plt.show()]

如果要在同一子批次中绘制所有数据,请按如下方式进行:

fig, ax = plt.subplots(figsize=(10, 6))
for df in dfs.values():
    ax.errorbar(df.e, df.y, xerr=df.de, yerr=df.y_err, fmt='o', label='data')
plt.show()]

太好了。你能说些关于
content=”“.join(f.readlines()[skiprows:])
的更多信息吗?另外,根据主帖子,我想用不同的颜色在同一个图中绘制所有数据集。你能编辑你的代码来反映这一点吗?我不认为这很复杂,但我希望看到一种有效的方法。只是对你提到的那行添加了一些注释+添加了一些代码,以便只在一个图形中绘制(我一开始跳过了它,因为两个图形上的(非常)不同的比例使得阅读起来不方便…)。关于注释:您可以查看更多关于readlines和join的信息。请注意,读线将所有“\n”(即换行符)保留在每个拆分行的末尾,因此您可以通过纯空白字符串(即“”)进行连接。非常感谢。
fig, axs = plt.subplots(len(dfs), figsize=(10, 6))
for ax, df in zip(list(axs), dfs.values()):
    ax.errorbar(df.e, df.y, xerr=df.de, yerr=df.y_err, fmt='o', label='data')
plt.show()
fig, ax = plt.subplots(figsize=(10, 6))
for df in dfs.values():
    ax.errorbar(df.e, df.y, xerr=df.de, yerr=df.y_err, fmt='o', label='data')
plt.show()]