2017-05-25 44 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

相关问题