2017-05-25 3 views
2

ich einen Datenrahmen nicht übereinstimmen müssen, wie unten dargestellt:Reihe von Datenrahmen mit vorheriger Reihe registrieren, falls Bedingung

df

data 
10.100.10.10==> [{'ID': 'abcdef', 'date': '2017-04-14', 'serialNo': '215687'}] 
10.100.10.10==> [{'ID': 'abcdef', 'date': '2017-04-16', 'serialNo': '456123'}] 
10.100.10.10==> [{'ID': 'abcdef', 'date': '2017-04-17' 
, 'serialNo': '456125'}] 
10.100.10.10==> [{'ID': 'qwerty', 'date': '2017-04-20', 'serialNo': '456166'}] 
10.100.10.10==> [{'ID': 'qwerty', 'date': '2017-04-21', 'seri 
alNo': '756984'}] 
10.100.10.10==> [{'ID': 'zxcvbn', 'date': '2017-04-24', 'serialNo': '852369'}] 
10.100.10.10==> [{'ID': 'zxcvbn', 'date': '2017-04-26', 'serialNo': '852367'}] 
10.100.10.10==> [{'ID': 'zaqwsx', 
'date': '2017-04-27', 'serialNo': '854123'}] 
10.100.10.10==> [{'ID': 'edcvfr' 
, 'date': '2017-04-28', 'serialNo': '852369'}] 
10.100.10.10==> [{'ID': 'yuiopa', 'date': '2017-04-29', 'serialNo': '523698'}] 

Was ich will, ist, wenn Zeile nicht mit bestimmten Zeichenfolge beginnen wird (hier in meinem Fall ist es "10.100.10.10 ==>") es sollte mit der vorherigen Zeile verbunden werden. Hier in Beispiel Zeile 4 beginnt nicht mit „10.100.10.10 ==>“, so dass es mit der Zeile 3. Gleiche wie für Zeile 7, 11 und 13.

data 
10.100.10.10==> [{'ID': 'abcdef', 'date': '2017-04-14', 'serialNo': '215687'}] 
10.100.10.10==> [{'ID': 'abcdef', 'date': '2017-04-16', 'serialNo': '456123'}] 
10.100.10.10==> [{'ID': 'abcdef', 'date': '2017-04-17', 'serialNo': '456125'}] 
10.100.10.10==> [{'ID': 'qwerty', 'date': '2017-04-20', 'serialNo': '456166'}] 
10.100.10.10==> [{'ID': 'qwerty', 'date': '2017-04-21', 'serialNo': '756984'}] 
10.100.10.10==> [{'ID': 'zxcvbn', 'date': '2017-04-24', 'serialNo': '852369'}] 
10.100.10.10==> [{'ID': 'zxcvbn', 'date': '2017-04-26', 'serialNo': '852367'}] 
10.100.10.10==> [{'ID': 'zaqwsx', 'date': '2017-04-27', 'serialNo': '854123'}] 
10.100.10.10==> [{'ID': 'edcvfr', 'date': '2017-04-28', 'serialNo': '852369'}] 
10.100.10.10==> [{'ID': 'yuiopa', 'date': '2017-04-29', 'serialNo': '523698'}] 

ich war in der Lage, es zu tun mit unten verbunden ist Code, aber ich habe riesige Datenmenge und es dauert lange.

for i in range(0,len(df["Data"])): 
    if df['Data'][i].startswith("10.100.10.10==>"): 
     df['Data'][i] = df['Data'][i] 
    else: 
     df['Data'][i-1] = "".join([df['Data'][i-1],df['Data'][i]]) 
df = df[df['Data'].str.startswith("10.100.10.10==>")].reset_index(drop=True) 

Bitte lassen Sie mich wissen, wenn es andere schnelleren Weg, um diese Aufgabe abzuschließen.

Antwort

4
marker = '10.100.10.10==>' 
groups = df.Data.str.startswith(marker).cumsum() 
df.Data.groupby(groups).sum() 

0 
1  10.100.10.10==> [{'ID': 'abcdef', 'date': '201... 
2  10.100.10.10==> [{'ID': 'abcdef', 'date': '201... 
3  10.100.10.10==> [{'ID': 'abcdef', 'date': '201... 
4  10.100.10.10==> [{'ID': 'qwerty', 'date': '201... 
5  10.100.10.10==> [{'ID': 'qwerty', 'date': '201... 
6  10.100.10.10==> [{'ID': 'zxcvbn', 'date': '201... 
7  10.100.10.10==> [{'ID': 'zxcvbn', 'date': '201... 
8  10.100.10.10==> [{'ID': 'zaqwsx', 'date': '201... 
9  10.100.10.10==> [{'ID': 'edcvfr', 'date': '201... 
10 10.100.10.10==> [{'ID': 'yuiopa', 'date': '201... 
Name: 0, dtype: object 
+0

Danke @piRSquared. Das funktioniert genau so, wie ich es wollte. – Shadkhan

1

Verwenden Sie keine Pandas dafür. Lesen Sie die Datei Zeile für Zeile und erstellen Sie eine Liste mit Zeilen. Dann kannst du diese Liste korrigierter Linien in Pandas laden. Sie brauchen keine schicke Verbindung oder irgendetwas anderes - erstellen Sie einfach eine Liste und fügen Sie sie an das vorherige Element an, wenn die nächste Zeile nicht mit dem beginnt, was Sie erwarten.

Wenn Sie möchten, können Sie jede Zeile auf ==> teilen und den ersten Teil in eine Pandas-Serie und den Rest in einen DataFrame laden. pd.io.json.json_normalize() kann für diesen letzten Teil helfen.

+0

Danke für die Antwort @John. – Shadkhan

Verwandte Themen