2017-05-03 4 views
0

Mein Python-Skript ein Wörterbuch erzeugt wie folgt:eine csv mit Wörterbuch Werte Anfügen Pandas Python mit

========================= =======================================

TL & DR

Ich komplizierte das Problem mit from_dict Methode, während Sie einen Datenrahmen aus dem Wörterbuch erstellen. Danke an @Sword.

Mit anderen Worten, pd.DataFrame.from_dict wird nur benötigt, wenn Sie einen Datenrahmen mit allen Schlüsseln in einer Spalte erstellen möchten, alle Werte in einer anderen Spalte. In allen anderen Fällen ist es so einfach wie in der angenommenen Antwort.

============================================== ================

{u'19:00': 2, u'12:00': 1, u'06:00': 2, u'00:00': 0, u'23:00': 2, u'05:00': 2, u'11:00': 4, u'14:00': 2, u'04:00': 0, u'09:00': 7, u'03:00': 1, u'18:00': 6, u'01:00': 0, u'21:00': 5, u'15:00': 8, u'22:00': 1, u'08:00': 5, u'16:00': 8, u'02:00': 0, u'13:00': 8, u'20:00': 5, u'07:00': 11, u'17:00': 12, u'10:00': 8} 

und es produziert auch eine Variable, lassen sie uns sagen full_name (als Argument an das Skript genommen), die den Wert „John“ hat.

Jedes Mal, wenn ich das Skript ausführe, gibt es mir ein Wörterbuch und einen Namen im oben genannten Format.

Ich möchte für eine spätere Analyse in folgendem Format diese in eine CSV-Datei schreiben:

FULLNAME | 00:00 | 01:00 | 02:00 | .....| 22:00 | 23:00 | 
John  | 0  | 0  | 0  | .....| 1  | 2  | 

Mein Code, das zu produzieren ist wie folgt:

import collections 
import pandas as pd 

# ........................ 
# Other part of code, which produces the dictionary by name "data_dict" 
# ........................ 

#Sorting the dictionary (And adding it to a ordereddict) in order to skip matching dictionary keys with column headers 
data_dict_sorted = collections.OrderedDict(sorted(data_dict.items())) 

# For the first time to produce column headers, I used .items() and rest of the following lines follows it. 
# df = pd.DataFrame.from_dict(data_dict_sorted.items()) 

#For the second time onwards, I just need to append the values, I am using .values() 
df = pd.DataFrame.from_dict(data_dict_sorted.values()) 

df2 = df.T # transposing because from_dict creates all keys in one column, and corresponding values in the next column. 
df2.columns = df2.iloc[0] 
df3 = df2[1:] 
df3["FULLNAME"] = args.name #This is how we add a value, isn't it? 
df3.to_csv('test.csv', mode = 'a', sep=str('\t'), encoding='utf-8', index=False) 

Mein Code ist dabei die folgende

csv
00:00 | 01:00 | 02:00 | …….. | 22:00 | 23:00 | FULLNAME 
0  | 0  | 0  | …….. | 1  | 2  | John 
0  | 0  | 0  | …….. | 1  | 2  | FULLNAME 
0  | 0  | 0  | …….. | 1  | 2  | FULLNAME 

Meine Frage ist zweifach:

  1. Warum wird "FULLNAME" anstelle von "John" in der zweiten Iteration gedruckt (wie beim zweiten Mal, wenn das Skript ausgeführt wird)? Was fehlt mir?
  2. gibt es einen besseren Weg, dies zu tun?

Antwort

1

Wie wäre es damit?

df = pd.DataFrame(data_dict, index=[0]) 
df['FullName'] = 'John' 

EDIT:
Es ist ein bisschen schwierig ist, die Art und Weise Sie führen die Vorgänge zu verstehen, aber es sieht aus wie das Problem mit der Linie df.columns = df.iloc[0] ist. Der obige Code, den ich erwähnt habe, benötigt keine Zuweisung von Spaltennamen oder der Transponieroperation. Wenn Sie ein Wörterbuch bei jeder Iteration hinzufügen, versuchen:

data_dict['FullName'] = 'John' 
df = df.append(pd.DataFrame(data_dict, index =[0]), ignore_index = True).reset_index() 

Wenn jede Zeile einen anderen Namen haben könnte, dann df['FullName'] = 'John' wird die gesamte Spalte dazu führen, John zu. Daher als bessere Schritt, erstellen Sie einen Schlüssel ‚Fullname‘ in Ihrem dict mit dem entsprechenden Namen genannt als Wert einen einheitlichen Wert für die gesamte Spalte d.h

data_dict['FullName'] = 'John' 
+0

zu vermeiden Zuordnung Was bedeutet Index = [0] tut? – kingmakerking

+0

immer wenn Sie ein Wörterbuch an pd übergeben.DataFrame müssen die Werte für jeden Schlüssel in einem Listenformat vorliegen. Aber in Ihrem Fall sind die Werte ganze Zahlen und skalare Bedürfnisse können nur weitergegeben werden, wenn Sie Informationen über den Index bereitstellen. index = [0] bedeutet einfach, dass der Index der Zeile 0 ist. Bei mehreren Zeilen sollte dies eine Liste von Indizes sein, die Bezeichnungen oder Zahlen sein können. –

+0

Aber ich glaube nicht, dass das das Problem löst, mit dem ich hier konfrontiert bin. – kingmakerking

Verwandte Themen