簡體   English   中英

Pandas DataFrame 來自 Numpy 數組 - 列順序

[英]Pandas DataFrame from Numpy Array - column order

I'm trying to read data from a.csv file using Pandas, smoothing it with Savitsky-Golay filter, filtering it and then using Pandas again to write an output csv file. 數據必須從 DataFrame 轉換為數組以執行平滑,然后再轉換為 DataFrame 以創建 output 文件。

I found a topic on creation of dataframe from numpy arrays ( Creating a Pandas DataFrame from a Numpy array: How do I specify the index column and column headers? ) and i used the dataset = pd.DataFrame({'Column1': data[:, 0], 'Column2': data[:, 1]})行來創建我的。

問題是,當我將第一列的列名重命名為“時間”並將第二列重命名為“角度”時,最終 dataframe 中的順序會發生變化。 似乎字母順序很重要,這似乎很奇怪。 有人可以幫我解釋一下嗎?

我的完整代碼:

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

您的問題本質上是:為什么此代碼會導致按字母順序排列的列順序,而不是我提供的順序?

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(2018 年 5 月發布)中進行了更改。

如果您的數據已經在 dataframe 中,只需將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將為您執行此操作:

如果 x 不是單精度或雙精度浮點數組,則在過濾前將其轉換為 numpy.float64 類型。

如果您想要原始 dataframe 中的原始數據和平滑數據,則只需為其分配一個新列:

data['angle'] = signal.savgol_filter(data.Pitch.values, window_length, polyorder)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM