如果条件不匹配,请将前一行的数据行加入

时间:2017-05-25 14:13:56

标签: python pandas

我有一个如下所示的数据框:

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)

如果还有其他更快捷的方法可以完成此任务,请与我们联系。

2 个答案:

答案 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()可以为最后一部分提供帮助。