我正在嘗試讀取空格分隔值,將 Savitzky-Golay 過濾器應用于其中一列,將列四舍五入為 6 位十進制數字,繪制圖形并將數據導出到新文件。這是我注釋掉使圖形窗口“無響應”的行的工作代碼:import pandas as pdfrom datetime import datetimeimport numpy as npimport matplotlib.pyplot as pltfrom scipy.signal import savgol_filterdf = 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 filterdf.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 wellplt.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)則程序正常結束。盡管在四舍五入后將數據保存到文件中效果很好,但繪圖不會:-/
1 回答

GCT1015
TA貢獻1827條經驗 獲得超4個贊
如果要將列四舍五入到第 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 軸上給出自己的刻度)。
添加回答
舉報
0/150
提交
取消