1.发现问题
在编程的时候发现在自定义函数里调用sort_values()报错
TypeError: sort_values() got an unexpected keyword argument 'by'
sort_values()用法:
DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)
参数讲解:
by:要排序的名称或名称列表。(如果轴为 0 或“索引”,则 by 可能包含索引级别或列标签。如果轴为 1 或“列”,则 by 可能包含列级别或索引标签。
axis:要排序的轴。若axis=0或'index',则按照指定列中数据大小排序;若axis=1或'columns',则按照指定索引中数据大小排序,默认axis=0
ascending:bool或bool的列表,默认为True,即为升序排列。 为多个排序顺序指定列表。如果这是一个布尔值列表,则必须匹配by的长度。
inplace:是否用排序后的数据集替换原来的数据,默认为False,即不替换。
kind: 排序算法的选择。对于DataFrames,此选项仅在对单个列或标签排序时应用。
na_position:如果是第一个,则将NaNs放在开头;如果是最后一个,把NaNs放在最后。
ignore_index:如果为True,则结果轴将被标记为0,1,,n - 1。
key:在排序之前对值应用键函数。这类似于内置sorted()函数中的key参数,显著的区别是这个key函数应该是向量化的。它应该期望一个Series,并返回一个与输入具有相同形状的Series。它将被独立地应用到每一列。
2.找出问题所在
思来想去发现是在自定义函数中才会出现这样的错误,并不是语法上的错误
错误的代码大致如下:
import pandas as pd
def getData():
df = pd.read_csv("datas_map.csv")
df.index = pd.to_datetime(df.index)
print(type(df))
df.sort_values(by = 'date',inplace = True)
data = df.close
data = data.fillna(0)
return data
def matching(df1,df2):
if(df1.index[0] > df2.index[0]):
i = 0
while df2.index[i]<df1.index[0]:
a = pd.DataFrame(0,df2.index[i])
df1 = df1.append(a,ignore_index=True)
i += 1
if(df1.index[0] < df2.index[0]):
i = 0
while df1.index[i]<df2.index[0]:
a = pd.DataFrame(0,df1.index[i])
df2 = df2.append(a,ignore_index=True)
i += 1
print(type(df1))
df1.sort_values(by="date",inplace = True)
df2.sort_values(by="date",inplace = True)
return df1,df2
df1 = getData()
df2 = df1[10:100]
df1,df2 = matching(df1,df2)
在getData函数中df是pandas.core.frame.DataFrame类型,而df1 = getData()时df1意外赋值成pandas.core.series.Series类型,而matching(df1,df2)导入的是pandas.core.series.Series类型。
在pandas中dataFrame调用sort_values()时可以使用by关键词,而series使用by关键词会报错。
3.解决问题
由于series(序列)不能调用by关键词,我们只需在matching(df1,df2)函数下加上
df1 = pd.DataFrame(df1,df1.index)
df2 = pd.DataFrame(df2,df2.index)
就可以了