将多个字典附加到 Pandas 数据框:错误 DataFrame 构造函数未正确调用?

Posted

技术标签:

【中文标题】将多个字典附加到 Pandas 数据框:错误 DataFrame 构造函数未正确调用?【英文标题】:Appending multiple dictionaries to Pandas dataframe: Error DataFrame constructor not properly called? 【发布时间】:2018-08-27 20:54:54 【问题描述】:

我正在尝试将dictionary 发送到pandas dataframe。我在一些事情上遇到了麻烦。我尝试了以下

data = 'applicableMargin': '12.50', 'marketType': 'N', 'totalBuyQuantity': '1,14,514', 'buyPrice1': '1,546.30', 'dayLow': '1,541.20', 'symbol': 'ACC', 'cm_adj_low_dt': '23-MAR-17', 'open': '1,571.50', 'sellPrice2': '1,547.85', 'sellPrice4': '1,547.95', 'cm_ffm': '13,249.84', 'buyPrice3': '1,546.00', 'css_status_desc': 'Listed', 'ndStartDate': '-', 'buyQuantity1': '43', 'totalTradedValue': '1,468.42', 'surv_indicator': '-', 'recordDate': '26-JUL-17', 'secDate': '16MAR2018', 'faceValue': '10.00', 'totalTradedVolume': '94,384', 'pricebandlower': '1,411.20', 'sellQuantity4': '16', 'averagePrice': '1,555.79', 'buyPrice2': '1,546.05', 'totalSellQuantity': '84,873', 'closePrice': '0.00', 'buyPrice4': '1,545.90', 'extremeLossMargin': '5.00', 'isinCode': 'INE012A01025', 'buyQuantity4': '48', 'sellPrice3': '1,547.90', 'bcEndDate': '-', 'buyQuantity5': '27', 'indexVar': '-', 'purpose': 'INTERIM DIVIDEND - RS 11/- PER SHARE', 'sellQuantity5': '286', 'series': 'EQ', 'low52': '1,380.40', 'dayHigh': '1,573.70', 'pricebandupper': '1,724.70', 'basePrice': '1,567.95', 'lastPrice': '1,546.05', 'sellQuantity2': '32', 'deliveryToTradedQuantity': '50.45', 'high52': '1,869.95', 'cm_adj_high_dt': '13-SEP-17', 'sellQuantity1': '67', 'buyQuantity2': '155', 'isExDateFlag': False, 'quantityTraded': '2,53,481', 'previousClose': '1,567.95', 'securityVar': '5.74', 'bcStartDate': '-', 'sellQuantity3': '25', 'ndEndDate': '-', 'buyQuantity3': '31', 'companyName': 'ACC Limited', 'sellPrice1': '1,547.65', 'adhocMargin': '-', 'sellPrice5': '1,548.00', 'change': '-21.90', 'exDate': '25-JUL-17', 'varMargin': '7.50', 'pChange': '-1.40', 'buyPrice5': '1,545.85', 'priceBand': 'No Band'



pd_cols = []
for i in data:
    pd_cols.append(i)

#fut_data = pd.DataFrame()
#fut_data.columns = pd_cols
fut_data = pd.DataFrame(data.items(), columns=pd_cols)

这给出了错误:

Traceback(最近一次调用最后一次): 文件“”,第 1 行,在 文件“C:\Python34\lib\site-packages\pandas\core\frame.py”,第 345 行,在 >init 中 raise PandasError('DataFrame 构造函数没有正确调用!') pandas.core.common.PandasError: DataFrame 构造函数没有正确调用!

在此之后,我将拥有更多dict,它们将拥有相同的columns。我想将它们全部添加到同一个database

提前致谢。

【问题讨论】:

试试这个:fut_data = pd.DataFrame.from_dict(data, orient='index')或其转置fut_data = pd.DataFrame.from_dict(data, orient='index').T ***.com/questions/17839973/…的可能重复 【参考方案1】:

这对我有用。由于此错误对您来说,您可能会遇到复制粘贴错误。

fut_data = pd.DataFrame.from_dict(data, orient='index').T

print(fut_data)

#   applicableMargin marketType totalBuyQuantity buyPrice1    dayLow symbol  \
# 0            12.50          N         1,14,514  1,546.30  1,541.20    ACC   

#   cm_adj_low_dt      open sellPrice2 sellPrice4    ...     companyName  \
# 0     23-MAR-17  1,571.50   1,547.85   1,547.95    ...     ACC Limited   

#   buyPrice5 priceBand  
# 0  1,545.85   No Band  

# [1 rows x 67 columns]

你可以按如下方式追加:

df = pd.DataFrame.from_dict(data, orient='index').T

df = df.append(pd.DataFrame.from_dict(data2, orient='index').T)

这里data2另一个类似的字典。

【讨论】:

谢谢,我猜这个错误是我在某个地方的错误。如果我尝试向数据框添加不同的dict(具有相同的列/键),它会覆盖现有行,我该如何添加新行? 另一个快速问题,当我使用字典添加更多行时。他们都将索引设置为0,我该如何更改?感谢所有的帮助。 添加完所有词典后,可以df = df.reset_index(drop=True)【参考方案2】:

这会给你想要的输出吗?

import pandas as pd
data = 'applicableMargin': '12.50', 'marketType': 'N', 'totalBuyQuantity': '1,14,514', 'buyPrice1': '1,546.30', 'dayLow': '1,541.20', 'symbol': 'ACC', 'cm_adj_low_dt': '23-MAR-17', 'open': '1,571.50', 'sellPrice2': '1,547.85', 'sellPrice4': '1,547.95', 'cm_ffm': '13,249.84', 'buyPrice3': '1,546.00', 'css_status_desc': 'Listed', 'ndStartDate': '-', 'buyQuantity1': '43', 'totalTradedValue': '1,468.42', 'surv_indicator': '-', 'recordDate': '26-JUL-17', 'secDate': '16MAR2018', 'faceValue': '10.00', 'totalTradedVolume': '94,384', 'pricebandlower': '1,411.20', 'sellQuantity4': '16', 'averagePrice': '1,555.79', 'buyPrice2': '1,546.05', 'totalSellQuantity': '84,873', 'closePrice': '0.00', 'buyPrice4': '1,545.90', 'extremeLossMargin': '5.00', 'isinCode': 'INE012A01025', 'buyQuantity4': '48', 'sellPrice3': '1,547.90', 'bcEndDate': '-', 'buyQuantity5': '27', 'indexVar': '-', 'purpose': 'INTERIM DIVIDEND - RS 11/- PER SHARE', 'sellQuantity5': '286', 'series': 'EQ', 'low52': '1,380.40', 'dayHigh': '1,573.70', 'pricebandupper': '1,724.70', 'basePrice': '1,567.95', 'lastPrice': '1,546.05', 'sellQuantity2': '32', 'deliveryToTradedQuantity': '50.45', 'high52': '1,869.95', 'cm_adj_high_dt': '13-SEP-17', 'sellQuantity1': '67', 'buyQuantity2': '155', 'isExDateFlag': False, 'quantityTraded': '2,53,481', 'previousClose': '1,567.95', 'securityVar': '5.74', 'bcStartDate': '-', 'sellQuantity3': '25', 'ndEndDate': '-', 'buyQuantity3': '31', 'companyName': 'ACC Limited', 'sellPrice1': '1,547.65', 'adhocMargin': '-', 'sellPrice5': '1,548.00', 'change': '-21.90', 'exDate': '25-JUL-17', 'varMargin': '7.50', 'pChange': '-1.40', 'buyPrice5': '1,545.85', 'priceBand': 'No Band'
df = pd.DataFrame.from_dict([data])

print(df.iloc[:,:5])

当我运行上面的代码时,我得到一个 1 行数据框:

  adhocMargin applicableMargin averagePrice basePrice bcEndDate
0           -            12.50     1,555.79  1,567.95         -

如果您有多个相似的字典,请将它们全部放在一个列表中,如下所示:

df = pd.DataFrame.from_dict([data1,data2])

这会产生一个数据框,每个字典有一行。

【讨论】:

不确定pd.DataFrame.from_dict([data]) 是否需要data 作为列表。不过,看起来它可以正常工作。 我添加了一个更完整的示例 - 请再试一次。 感谢您的回答。看来我这边有一些错误。该命令现在有效。如果我尝试向数据框添加不同的字典(具有相同的列/键),它会覆盖现有行,我该如何添加新行? @Jon - 如果我不使用列表,我会得到 ValueError: If using all scalar values, you must pass an index【参考方案3】:

虽然前面的答案更好,但如果它适合你,你可以试试这个荒谬的解决方案:

    fut_data = pd.DataFrame(data,index=[0])

要添加更多行,您可以尝试:

    fut_data1 = pd.DataFrame(data1,index=[1])
    fut_data.append(fut_data1)

    fut_data1 = pd.DataFrame(data1,index=[i]) #where i is a loop variable
    fut_data.append(fut_data1)

【讨论】:

以上是关于将多个字典附加到 Pandas 数据框:错误 DataFrame 构造函数未正确调用?的主要内容,如果未能解决你的问题,请参考以下文章

将 Pymongo 数据从列表附加到 pandas 数据框

从列表的字典中提取列表,然后附加到数据框

在循环中将字典附加到熊猫数据框

python将多个excel中的所有工作表附加到pandas数据框中的有效方法

如何将 Python 字典附加到 Pandas DataFrame,将键与列名匹配

Python Pandas:将嵌套字典转换为数据框