【问题标题】:Unable to sort Pandas DataFrame无法对 Pandas DataFrame 进行排序
【发布时间】:2018-07-03 14:15:33
【问题描述】:

我正在尝试遵循这个例子:

以下格式的数据存储在 csv 文件中:

  Date       Open    High    Low   Close   Adj. close  Volume 
23/01/2018    1.00    3.00    2.00   2.10     2.15       1000

使用以下代码读取此数据:

self.symbol_data[s] = pd.io.parsers.read_csv( os.path.join(self.csv_dir,
’%s.csv’ % s), 
header=0, index_col=0, parse_dates=True,
names=['datetime’, ’open’, ’high’, ’low’, ’close’, ’volume’, ’adj_close’]).sort()

只是为了检查 .sort() 按第一列中的值对帧进行排序是否正确?

我的问题是我使用不同版本的 Python 3.6 与他的 2.x 和不同版本的 pandas 0.22.0 vs(不确定,但它更旧),我也试图从不同的具有不同格式的源。有一些额外的列,列的名称略有不同。

timestamp     open    high    low   close adjusted_close  Volume div_amt split
23/01/2018    1.00    3.00    2.00   2.10     2.15         1000     0      1 

self.symbol_data[s] = pd.read_csv(os.path.join(self.csv_dir, '%s.csv' %s),
usecols=[0,1,2,3,4,5,6],
header=0, index_col=0, parse_dates=True,
names=['timestamp', 'open', 'high','low', 'close', 'adjusted_close',
    'volume']).sort_values(by=['timestamp'])

上面的 pd.read_csv 调用会实现我想要的吗?

是否可以按名称选择要读取的列?

我还可以检查 names=[] 是指 Pandas DateFrame 中的列吗?
我认为python帮助对此并不清楚: names :要使用的列名列表。
pandas 数据框的 csv 文件的哪些列以及用于什么?

无论如何,目前我在排序部分遇到问题。 sort_values 是否与上面的 sort() 等效(by='timestamp')?

我也收到此错误:

KeyError: '时间戳'

关于如何解决这个问题的任何建议?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您将第一列设置为由index_col=0 索引,因此需要将sort_values 更改为sort_index。

    它在一些非常旧的 pandas 版本中是如何工作的,下面是 0.17.0 - 检查 docs。

    编辑:

    Csv 具有标题 col1 和 col2。如果要替换列名,请使用参数names 和header=0:

    temp=u"""col1,col2
    1,2
    4,8"""
    #after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
    df = pd.read_csv(pd.compat.StringIO(temp), names=['a', 'b'], header=0)
    print (df)
       a  b
    0  1  2
    1  4  8
    

    如果省略 header=0 新的列名被添加:

    temp=u"""col1,col2
    1,2
    4,8"""
    #after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
    df = pd.read_csv(pd.compat.StringIO(temp), names=['a', 'b'])
    print (df)
          a     b
    0  col1  col2
    1     1     2
    2     4     8
    

    但如果没有csv 标头并使用header=0,则第一个数据行1 和2 将丢失:

    temp=u"""
    1,2
    4,8"""
    #after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
    df = pd.read_csv(pd.compat.StringIO(temp), names=['a', 'b'], header=0)
    print (df)
       a  b
    0  4  8
    

    正确只需要参数names:

    temp=u"""
    1,2
    4,8"""
    #after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
    df = pd.read_csv(pd.compat.StringIO(temp), names=['a', 'b'])
    print (df)
       a  b
    0  1  2
    1  4  8
    

    【讨论】:

    • 这回答了我感谢你的错误,但另一个问题是:是否可以选择按名称读取的列?
    • 还有n​​ames=[]是否设置了已经读入的pandas dataframe的列名
    • 你认为names参数?是的,但如果没有csv 的标头,则使用它。有 2 种可能的方法 - 如果使用 header=0 ir 替换原始列名(csv 中的第一行),如果省略它,它会创建新的列名而不替换。
    猜你喜欢
    • 2016-09-14
    • 2022-01-21
    • 2014-11-29
    • 2016-12-01
    • 2021-06-29
    • 2021-03-21
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    相关资源
    最近更新 更多