我有一个如下所示的数据框:
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)
如果还有其他更快捷的方法可以完成此任务,请与我们联系。
答案 0 :(得分: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
答案 1 :(得分:1)
请勿使用Pandas。只需一次读取一行文件,然后构建一个行列表。然后,您可以将已更正的行列表加载到Pandas中。您不需要花哨的连接或其他任何东西 - 只需构建一个列表,并在下一行没有以您期望的内容开头时附加到上一个项目。
如果需要,可以在==>
上拆分每一行,然后将第一部分加载到Pandas系列中,将其余部分加载到DataFrame中。 pd.io.json.json_normalize()
可以为最后一部分提供帮助。