当有 2 个索引时追加 Pandas DataFrame
Appending Pandas DataFrame when 2 Indexes
创建了一个空的 pandas DataFrame:
results = pd.DataFrame(columns=['age','timestamp','score']).set_index(['age', 'timestamp'])
更多 DataFrame 将附加到初始 results
DataFrame。
result = pd.DataFrame({'age': age,
'timestamp': timestamp,
'score': score
}).set_index(['age', 'timestamp'])
# error then occurs at this point
results.append(result)
我们得到了错误
ValueError: If using all scalar values, you must pass an index
附加第二个 DataFrame 的正确方法是什么?
试试这个。由于您新添加的记录只有一行。通过一个新的数据帧初始化它会引入开销。只需通过 .loc
将 dict 传递给当前的 df 即可。
请注意,一条一条地添加记录效率不高。但是如果这是你的代码逻辑的一部分,这是不可避免的,那么 .loc
会给你带来比 pd.append()
或 pd.concat()
.
更好的性能。
import pandas as pd
import numpy as np
import datetime as dt
# create an empty df
results = pd.DataFrame(columns=['age', 'timestamp', 'score'])
Out[71]:
Empty DataFrame
Columns: [age, timestamp, score]
Index: []
# write new record in dict, make sure the keys match df column names
new_record = {'age': 23, 'timestamp': dt.datetime(2015,1,1), 'score':98}
# use .loc to enlarge the current df
results.loc[len(results)] = new_record
Out[73]:
age timestamp score
0 23 2015-01-01 98
创建了一个空的 pandas DataFrame:
results = pd.DataFrame(columns=['age','timestamp','score']).set_index(['age', 'timestamp'])
更多 DataFrame 将附加到初始 results
DataFrame。
result = pd.DataFrame({'age': age,
'timestamp': timestamp,
'score': score
}).set_index(['age', 'timestamp'])
# error then occurs at this point
results.append(result)
我们得到了错误
ValueError: If using all scalar values, you must pass an index
附加第二个 DataFrame 的正确方法是什么?
试试这个。由于您新添加的记录只有一行。通过一个新的数据帧初始化它会引入开销。只需通过 .loc
将 dict 传递给当前的 df 即可。
请注意,一条一条地添加记录效率不高。但是如果这是你的代码逻辑的一部分,这是不可避免的,那么 .loc
会给你带来比 pd.append()
或 pd.concat()
.
import pandas as pd
import numpy as np
import datetime as dt
# create an empty df
results = pd.DataFrame(columns=['age', 'timestamp', 'score'])
Out[71]:
Empty DataFrame
Columns: [age, timestamp, score]
Index: []
# write new record in dict, make sure the keys match df column names
new_record = {'age': 23, 'timestamp': dt.datetime(2015,1,1), 'score':98}
# use .loc to enlarge the current df
results.loc[len(results)] = new_record
Out[73]:
age timestamp score
0 23 2015-01-01 98