2016-08-04 26 views
1

Ich möchte eine CSV-Datei lesen und diese Datei im Pandas-Datenrahmen speichern, danach möchte ich überprüfen, dass ein Spaltenwert gleich einer konstanten Variable ist und dass gleiche Zeilen in einem separaten Datenrahmen gehalten werden sollen.Wie aktualisiert man alle Zeilen in bestimmten Spalten von Pandas Datenrahmen in Python?

Der nächste Schritt besteht darin, eine Spalte aus dem separaten Datenrahmen zu aktualisieren. In diesem Schritt durchlaufe ich den gesamten Datenrahmen und aktualisiere alle Zeilen einer bestimmten Spalte, so dass es zu lange dauern wird, da mein Datenrahmen tausende von Zeilen hat.

Input.csv-

line_no,time 
205,1467099122677889 
205,1467099122677889 
206,1467099363719028 
207,1467099363818373 
207,1467099363918360 
208,1467099363818373 
210,1467099363958749 

Program-

import pandas as pd 

if __name__ == "__main__": 

    file_path = 'Input.csv' 
    input_line_no = 205 

    pd_dataframe = pd.read_csv(file_path,delimiter=',',keep_default_na=False) 
    match_df = pd.DataFrame(pd_dataframe.loc[pd_dataframe['line_no'] == int(input_line_no)]) 

    if match_df.empty: 
     print 'Given line no is not present in dataframe.' 
     sys.exit(1) 
    match_df = match_df.applymap(str) 
    for index in range(0,len(match_df.index)): 

     epoch_time = match_df.iloc[index]['time'] 
     stamp = int(str(epoch_time)+'0') 
     date = datetime.datetime.fromtimestamp(stamp/10000000.0).strftime('%H:%M:%S %f')[:-3] 
     match_df['time'].apply(str) 
     match_df.iloc[index]['time'] = date 

    print match_df.to_csv(index=False) 

Diesmal Spalte ist in Epoche Zeit, die ich in den Menschen lesbaren Zeitstempel umwandeln möchten so Logik dafür ist, Zweck nur.

Aber ich bin in Bezug auf diese Aufgabe mit der Ausführungszeit Problem konfrontiert. Ist gibt es eine andere Möglichkeit, die Spalte des vorhandenen Datenrahmens auf die schnellere Weise zu aktualisieren?

+0

Wenn Gebrauch 'date = datetime.datetime.fromtimestamp (Stempel/10.000.000,0)' zurückgeben '2434.11.27 04: 20: 26.778889'. Ist es richtig? Oder ist es "2016-06-28 07: 32: 02"? – jezrael

+0

@jezrael - ja, es ist richtig und mach dir darüber keine Sorgen. Ich möchte nur wissen, wie kann ich die Ausführungszeit dieser Update-Spalte von Datenrahmen reduzieren? – kit

Antwort

1

IIUC können Sie zuerst verwenden:

match_df = pd_dataframe[pd_dataframe['line_no'] == int(input_line_no)].copy() 
print (match_df) 
    line_no    time 
0  205 1467099122677889 
1  205 1467099122677889 

Sie apply verwenden können, weil timestamp limitations:

In [55]: pd.Timestamp.max
Out [55]: Zeitstempel ('2262.04.11 23: 47: 16,854775807')

match_df['time'] = match_df.time 
          .apply(lambda x: datetime.datetime.fromtimestamp(int(str(x)+'0') 
           /10000000.0)) 
print (match_df) 
    line_no      time 
0  205 2016-06-28 09:32:02.677889 
1  205 2016-06-28 09:32:02.677889 

Und dann:

match_df['time'] = match_df.time 
          .apply(lambda x: datetime.datetime.fromtimestamp(int(str(x)+'0') 
           /10000000.0).strftime('%H:%M:%S %f')[:-3]) 
print (match_df) 
    line_no   time 
0  205 09:32:02 677 
1  205 09:32:02 677 
+0

Tut mir leid, ich bin nicht sicher mit der Umwandlung von epoch_time zu datetime. Ist meine Ausgabe korrekt? – jezrael

+0

@ jezrael- Setzt dieses Skript die korrekte Zeilenzeit in die richtige Position? weil in der CSV-Datei alle Zeiten nicht gleich sind, so ist es notwendig, die Zeit einer bestimmten Zeile in eine menschenlesbare Zeitmarke zu ändern und nur an dieser Position zu platzieren? – kit

+0

für die Umwandlung von Epochen in menschenlesbare Zeitstempel meine Logik ist gut, weil einige Anforderungen, also kann ich meine Logik für die Umwandlung in menschliche Zeitstempel in Ihrem Code? Wenn ja, wie? – kit