2017-05-25 46 views
2

我有一個數據幀,如下圖所示:加入數據框中的行與前一行如果條件不匹配

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'}] 

我要的是,如果行不具有特定字符串開頭(在我的情況下它是「10.100.10.10 ==」),它應該與前一行連接。這裏例如在第4行是不是從開始「10.100.10.10 ==>」,因此它與3行同爲7行,第11和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'}] 

我能夠與下面做接合代碼,但我有巨大的數據集,它需要很長時間。

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) 

請讓我知道是否有任何其他更快的方式來完成此任務。

回答

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

謝謝@piRSquared。這完全按照我想要的方式工作。 – Shadkhan

1

不要使用熊貓這個。只要一次讀取一行文件,並建立一個行列表。然後,您可以將更正的行列表加載到Pandas中。你不需要花哨的連接或其他任何東西 - 只要建立一個列表,並追加到前一個項目,當下一行沒有開始你期望的。

如果你願意,你可以拆分==>的每一行,並將第一部分加載到Pandas系列中,其餘部分加載到DataFrame中。 pd.io.json.json_normalize()可能有助於最後一部分。

+0

感謝您的回答@John。 – Shadkhan

相關問題