猿问

舍入数据框列后绘图不起作用

我正在尝试读取空格分隔值,将 Savitzky-Golay 过滤器应用于其中一列,将列四舍五入为 6 位十进制数字,绘制图形并将数据导出到新文件。这是我注释掉使图形窗口“无响应”的行的工作代码:


import pandas as pd

from datetime import datetime

import numpy as np

import matplotlib.pyplot as plt

from scipy.signal import savgol_filter


df = pd.read_csv('data.txt', delim_whitespace = True)


plt.plot(df.index, df.rotram, '-', lw=4)

#plt.plot(df.index, savgol_filter(df.rotram, 21, 3), 'r-', lw=2)


# smooth the 'rotram' column using Savitzky-Golay filter

df.rotram = savgol_filter(df.rotram, 21, 3)


# round to 6 decimal digits

#df.rotram = df.rotram.map('{:.6f}'.format)         # <-- not responding when plotting

#df["rotram"] = df["rotram"].map('{:,.6f}'.format)  # the same as above (not responding when plotting)


# When plot is removed then above rounding works well

plt.plot(df.index, df.rotram, 'r-', lw=2)


df.to_csv('filtered.txt', sep='\t')


plt.show()


print "End"

示例数据如下所示:


otklon       rotram      lakat           rotnad

-6.240000    -3.317000   -34.445000      16.805000 

-6.633000    -3.501000   -34.519000      17.192000 

-5.099000    -2.742000   -34.456000      15.059000 

-6.148000    -3.396000   -34.281000      17.277000 

-4.797000    -3.032000   -34.851000      16.052000 

-5.446000    -2.964000   -34.459000      15.677000 

-6.341000    -3.490000   -34.934000      17.300000 

-6.508000    -3.465000   -35.030000      16.722000 

-6.513000    -3.505000   -35.018000      16.845000 

-6.455000    -3.501000   -35.302000      16.896000

.

.

.

(more than 20000 lines)

输入文件中的分隔符是space + TAB + space.


如果我取消注释该行,df.rotram = df.rotram.map('{:.6f}'.format)则程序挂起(无响应)并显示空图,尽管保存的数据是正确的。


如果我然后删除该行,plt.plot(df.index, df.rotram, 'r-', lw=2)则程序正常结束。


尽管在四舍五入后将数据保存到文件中效果很好,但绘图不会:-/


大话西游666
浏览 157回答 1
1回答

GCT1015

如果要将列四舍五入到第 N 个小数位,请使用pd.Series.round或np.around:df.rotram = df.rotram.round(decimals=6)# Or,# df.rotram = np.around(df.rotram, decimals=6)但是,我仍然想知道为什么上面的代码没有按预期工作。当您调用 时map,您将数字列转换为字符串。Pandas 会在不做任何假设的情况下绘制这些数据。对于您的示例数据,该图看起来很可怕:相反,后一种情况使用round:这些图完全不同(在前一种情况下,每个字符串按字典顺序排序并在 y 轴上给出自己的刻度)。
随时随地看视频慕课网APP

相关分类

Python
我要回答