【问题标题】:Pandas using loc for assignment in a Multi Index DataFramePandas 在多索引数据帧中使用 loc 进行分配
【发布时间】:2018-05-24 01:15:21
【问题描述】:

我已经像这样初始化了一个数据框:

df = pd.DataFrame(columns=["stockname","timestamp","price","volume"])
df.timestamp = pd.to_datetime(df.timestamp, format = "%Y-%m-%d %H:%M:%S:%f")
df.set_index(['stockname', 'timestamp'], inplace = True)

现在我从某个地方获取数据流,但为了程序,让我这样写:

filehandle = open("datasource")

for line in filehandle:
    line = line.rstrip()
    data = line.split(",")
    stockname = data[4]
    price = float(data[3])
    timestamp = pd.to_datetime(data[0], format = "%Y-%m-%d %H:%M:%S:%f")
    volume = int(data[6])

    df.loc[stockname, timestamp] = [price, volume]

filehandle.close()

print df

但这会报错:

ValueError: 无法使用长度与值不同的多索引选择索引器进行设置

【问题讨论】:

  • 可以添加"datasource"的样本吗?
  • 您知道,您不必做所有繁重的条带化、拆分工作,只需使用pd.read_csv。如果您添加文本文件示例,我将向您展示如何做到这一点。

标签: python pandas python-2.7 dataframe indexing


【解决方案1】:

我认为您正在寻找的是:

df.loc[a,b,:] = [c,d]

这是您的数据框的示例:

for i in range(3):
    for j in range(3):
        df.loc[(str(i),str(j)),:] = [i,j]

输出:

     c  d
a b      
0 0  0  0
  1  0  1
  2  0  2
1 0  1  0
  1  1  1
  2  1  2
2 0  2  0
  1  2  1
  2  2  2

【讨论】:

    【解决方案2】:

    指定要分配数据的列名,即

    df = pd.DataFrame(columns=["a","b","c","d"])
    df.set_index(['a', 'b'], inplace = True)
    
    df.loc[('3','4'),['c','d']] = [4,5]
    
    df.loc[('4','4'),['c','d']] = [3,1]
    
          c    d
    a b          
    3 4  4.0  5.0
    4 4  3.0  1.0
    

    另外,如果你有一个逗号分隔的文件,那么你可以使用read_csv 即:

    import io
    import pandas as pd
    st = '''2017-12-08 15:29:58:740657,245.0,426001,248.65,APPL,190342,2075673,249.35,244.2
            2017-12-08 16:29:58:740657,245.0,426001,248.65,GOOGL,190342,2075673,249.35,244.2
            2017-12-08 18:29:58:740657,245.0,426001,248.65,GOOGL,190342,2075673,249.35,244.2
            '''
    #instead of `io`, add the source name
    df = pd.read_csv(io.StringIO(st),header=None)
    # Now set the index and select what you want 
    df.set_index([0,4])[[1,7]]
    
                                       1       7
     0                          4                   
    2017-12-08 15:29:58.740657 APPL   245.0  249.35
    2017-12-08 16:29:58.740657 GOOGL  245.0  249.35
    2017-12-08 18:29:58.740657 GOOGL  245.0  249.35
    

    【讨论】:

    • 这行得通。现在你看到我有股票名称和时间框架。我想访问特定股票的所有数据,但我无法编写 df[df.index == "XYZ"] 那么如何编写以从数据框中访问特定股票数据?
    • @Tahseen 我需要看看数据的实际样子
    • 2017-12-08 15:29:58:740657,245.0,426001,248.65,APPL,190342,2075673,249.35,244.2
    • 这一行日志会有很多相同或不同的时间戳和相同或不同的股票名称。因此,在一个文件中,我存储了多个股票在任何特定时间的报价。这就是我索引时间和股票名称的原因
    • 但这对我来说就像你做的那样完美。谢谢
    【解决方案3】:

    您可能想使用df.at[index, column_name] = value 来避免此错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 2021-12-02
      • 2017-08-19
      • 2017-03-05
      • 2021-08-01
      • 2017-03-11
      相关资源
      最近更新 更多