Skip to main content
 首页 » 编程设计

python之Pandas 在多索引 DataFrame 中使用 loc 进行赋值

2025年05月04日12qq号

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

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: cannot set using a multi-index selection indexer with a different length than the value

请您参考如下方法:

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

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