Pandas 来自 Numpy 数组的 DataFrame - 列顺序
Pandas DataFrame from Numpy Array - column order
我正在尝试使用 Pandas 从 .csv 文件中读取数据,使用 Savitsky-Golay 过滤器对其进行平滑处理,对其进行过滤,然后再次使用 Pandas 写入输出 csv 文件。数据必须从 DataFrame 转换为数组以执行平滑,然后再次转换为 DataFrame 以创建输出文件。
我找到了一个关于从 numpy 数组创建数据帧的主题 (Creating a Pandas DataFrame from a Numpy array: How do I specify the index column and column headers?),我使用 dataset = pd.DataFrame({'Column1': data[:, 0], 'Column2': data[:, 1]})
行来创建我的。
问题是,当我将第一列的列名称重命名为 'time' 并将第二列的列名称重命名为 'angle' 时,最终数据框中的顺序发生了变化。似乎字母顺序很重要,这看起来很奇怪。
有人可以帮我解释一下吗?
我的完整代码:
import scipy as sp
from scipy import signal
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Specify the input file
in_file = '0_chunk0_test.csv'
# Define min and max angle values
alpha_min = 35
alpha_max = 45
# Define Savitsky-Golay filter parameters
window_length = 15
polyorder = 1
# Read input .csv file, but only time and pitch values using usecols argument
data = pd.read_csv(in_file,usecols=[0,2])
# Replace ":" with "" in time values
data['time'] = data['time'].str.replace(':','')
# Convert pandas dataframe to a numpy array, use .astype to convert
# string to float
data_arr = data.to_numpy(dtype=np.dtype,copy=True)
data_arr = data_arr.astype(np.float)
# Perform a Savitsky-Golay filtering with signal.savgol_filter
data_arr_smooth = signal.savgol_filter(data_arr[:,1],window_length,polyorder)
# Convert smoothed data array to dataframe and rename Pitch: to angle
data_fr = pd.DataFrame({'time': data_arr[:,0],'angle': data_arr_smooth})
print data_fr
如果您的数据已经在数据框中,只需将 Pitch
列的值传递给 savgol_filter
:
会容易得多
data_arr_smooth = signal.savgol_filter(data.Pitch.values, window_length, polyorder)
data_fr = pd.DataFrame({'time': data.time.values,'angle': data_arr_smooth})
只要数据是数字,就无需将数据显式转换为浮点数,savgol_filter
会为您完成此操作:
If x is not a single or double precision floating point array, it
will be converted to type numpy.float64 before filtering.
如果您想要原始数据框中的原始数据和平滑数据,则只需为其分配一个新列即可:
data['angle'] = signal.savgol_filter(data.Pitch.values, window_length, polyorder)
您的问题本质上是:为什么此代码会产生按字母顺序排列的列顺序,而不是我提供的顺序?
data_fr = pd.DataFrame({'time': data_arr[:,0],'angle': data_arr_smooth})
pandas(0.23+ 或 1.0+)的最新版本实际上可以满足您的需求,使用列 ['time', 'angle']
而不是 ['angle', 'time']
。
直到 Python 3.5,字典不保留键的顺序;通过按字母顺序排序,pandas 至少会给出可重现的列顺序。这已在 Pandas 0.23 (released May 2018) 中更改。
我正在尝试使用 Pandas 从 .csv 文件中读取数据,使用 Savitsky-Golay 过滤器对其进行平滑处理,对其进行过滤,然后再次使用 Pandas 写入输出 csv 文件。数据必须从 DataFrame 转换为数组以执行平滑,然后再次转换为 DataFrame 以创建输出文件。
我找到了一个关于从 numpy 数组创建数据帧的主题 (Creating a Pandas DataFrame from a Numpy array: How do I specify the index column and column headers?),我使用 dataset = pd.DataFrame({'Column1': data[:, 0], 'Column2': data[:, 1]})
行来创建我的。
问题是,当我将第一列的列名称重命名为 'time' 并将第二列的列名称重命名为 'angle' 时,最终数据框中的顺序发生了变化。似乎字母顺序很重要,这看起来很奇怪。 有人可以帮我解释一下吗?
我的完整代码:
import scipy as sp
from scipy import signal
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Specify the input file
in_file = '0_chunk0_test.csv'
# Define min and max angle values
alpha_min = 35
alpha_max = 45
# Define Savitsky-Golay filter parameters
window_length = 15
polyorder = 1
# Read input .csv file, but only time and pitch values using usecols argument
data = pd.read_csv(in_file,usecols=[0,2])
# Replace ":" with "" in time values
data['time'] = data['time'].str.replace(':','')
# Convert pandas dataframe to a numpy array, use .astype to convert
# string to float
data_arr = data.to_numpy(dtype=np.dtype,copy=True)
data_arr = data_arr.astype(np.float)
# Perform a Savitsky-Golay filtering with signal.savgol_filter
data_arr_smooth = signal.savgol_filter(data_arr[:,1],window_length,polyorder)
# Convert smoothed data array to dataframe and rename Pitch: to angle
data_fr = pd.DataFrame({'time': data_arr[:,0],'angle': data_arr_smooth})
print data_fr
如果您的数据已经在数据框中,只需将 Pitch
列的值传递给 savgol_filter
:
data_arr_smooth = signal.savgol_filter(data.Pitch.values, window_length, polyorder)
data_fr = pd.DataFrame({'time': data.time.values,'angle': data_arr_smooth})
只要数据是数字,就无需将数据显式转换为浮点数,savgol_filter
会为您完成此操作:
If x is not a single or double precision floating point array, it will be converted to type numpy.float64 before filtering.
如果您想要原始数据框中的原始数据和平滑数据,则只需为其分配一个新列即可:
data['angle'] = signal.savgol_filter(data.Pitch.values, window_length, polyorder)
您的问题本质上是:为什么此代码会产生按字母顺序排列的列顺序,而不是我提供的顺序?
data_fr = pd.DataFrame({'time': data_arr[:,0],'angle': data_arr_smooth})
pandas(0.23+ 或 1.0+)的最新版本实际上可以满足您的需求,使用列 ['time', 'angle']
而不是 ['angle', 'time']
。
直到 Python 3.5,字典不保留键的顺序;通过按字母顺序排序,pandas 至少会给出可重现的列顺序。这已在 Pandas 0.23 (released May 2018) 中更改。