有什么方法可以从DataFrame.from_dict中删除列和行号?

时间:2019-01-06 19:25:48

标签: python python-3.x pandas dataframe series

因此,我的字典中的数据框存在问题-python实际上用数字“命名”我的行和列。 这是我的代码:

a = dict()
dfList = [x for x in df['Marka'].tolist() if str(x) != 'nan']
dfSet = set(dfList)
dfList123 = list(dfSet)
for i in range(len(dfList123)):
    number = dfList.count(dfList123[i])
    a[dfList123[i]]=number
sorted_by_value = sorted(a.items(), key=lambda kv: kv[1], reverse=True)
dataframe=pd.DataFrame.from_dict(sorted_by_value)
print(dataframe)

我试图重命名像这样的列: dataframe=pd.DataFrame.from_dict(sorted_by_value, orient='index', columns=['A', 'B', 'C']),但这给我一个错误:

AttributeError: 'list' object has no attribute 'values'

有什么办法可以解决?

编辑: 这是我的数据框的第一部分:

                     0     1
0                   VW  1383
1                 AUDI  1053
2                VOLVO   789
3                  BMW   749
4                 OPEL   621
5        MERCEDES BENZ   593
...

第一行和第一列正是我要删除/重命名的

2 个答案:

答案 0 :(得分:0)

通过对dict_items对象(a.items())进行排序,您已经创建了一个列表。  您可以使用type(sorted_by_value)进行检查。然后,当您尝试使用pd.DataFrame.from_dict()方法时,该方法将失败,因为它期望使用具有“值”的字典,但会收到一个列表。

您可能对代码所做的最小修复是替换该行:

dataframe=pd.DataFrame.from_dict(sorted_by_value)

具有:

dataframe = pd.DataFrame(dict(sorted_by_value), index=[0])

(此处需要index=[0]参数,因为pd.DataFrame期望字典的格式为{'key1': [list1, of, values], 'key2': [list2, of, values]},但sorted_by_value会转换为{'key1': value1, 'key2': value2}的形式)

另一种选择是使用pd.DataFrame(sorted_by_value)直接从排序的项目生成数据帧,尽管您可能需要调整sorted_by_value或结果以获取所需的数据帧格式。

或者,查看collections.OrderedDict(其文档为here)以避免排序到列表,然后再转换回字典。

修改

关于列和索引的命名,如果看不到数据/所需结果,很难给出具体建议。上面的选项将消除错误,并允许您创建一个数据框,然后可以使用dataframe.columns = [list, of, column, headings]重命名其列。对于索引,请查看pd.DataFrame.set_index(drop=True)docs)和pd.DataFrame.reset_index()docs)。

答案 1 :(得分:0)

indexcolumns是数据框的属性

只要len(df.index) > 0len(df.columns) > 0(即您的数据帧具有非零行和非零列),就无法摆脱pd.DataFrame对象中的标签。数据帧是否由字典构造还是无关紧要。

您可以 做的是将它们从数据框的表示形式中删除,并以Python str对象或CSV文件的形式输出。这是一个最小的示例:

df = pd.DataFrame([[1, 2, 3], [4, 5, 6]])

print(df)
#    0  1  2
# 0  1  2  3
# 1  4  5  6

# output to string without index or headers
print(df.to_string(index=False, header=False))
# 1  2  3
# 4  5  6

# output to csv without index or headers
df.to_csv('file.csv', index=False, header=False)