【发布时间】:2015-08-09 00:50:00
【问题描述】:
总的来说,我是 pandas 和 python 的新手——感谢您提供的任何指导!
我有一个包含 4 列的 csv 文件。我正在尝试将前三列在所有行上都相同的行组合在一起(A 列第 1 行 = A 列第 2 行,B 列第 1 行 = B 列第 2 行,依此类推)
我的数据如下所示:
phone_number state date description
1 9991112222 NJ 2015-05-14 Condo
2 9991112222 NJ 2015-05-14 Condo sales call
3 9991112222 NJ 2015-05-14 Apartment rental
4 6668885555 CA 2015-05-06 Apartment
5 6668885555 CA 2015-05-06 Apartment rental
6 4443337777 NJ 2015-05-14 condo
因此,在此数据中,第 1、2 和 3 行将在一个组中,而第 4 和 5 行将在另一组中。第 6 行将不在具有 1、2 和 3 的组中,因为它具有不同的 phone_number。
然后,对于每一行,我想使用 Levenshtein 距离将描述列中的字符串与该组中的 其他描述 进行比较,并保留描述足够相似的行。
第 1 行的“Condo”将与第 2 行的“Condo sales call”和第 3 行的“Apartment rental”进行比较。它不会与第 6 行的“condo”进行比较。
最终,目标是剔除描述与同一组中的另一个描述不够相似的行。换一种说法,打印出描述至少与该组中的另一个(任何其他)描述有点相似的所有行。理想输出:
phone_number state date description
1 9991112222 NJ 2015-05-14 Condo
2 9991112222 NJ 2015-05-14 Condo sales call
4 6668885555 CA 2015-05-06 Apartment
5 6668885555 CA 2015-05-06 Apartment rental
第 6 行不打印,因为它从未在一个组中。第 3 行未打印,因为“公寓出租”与“公寓”或“公寓销售电话”不够相似
这是我到目前为止的代码。我不知道这是否是最好的方法。如果到目前为止我做得对,我不知道如何打印感兴趣的整行:
import Levenshtein
import itertools
import pandas as pd
test_data = pd.DataFrame.from_csv('phone_state_etc_test.csv', index_col=None)
for pn in test_data['phone_number']:
for dt in test_data['date']:
for st in test_data['state']:
for a, b in itertools.combinations(test_data[
(test_data['phone_number'] == pn) &
(test_data['state'] == st) &
(test_data['date'] == dt)
]
['description'], 2):
if Levenshtein.ratio(a,b) > 0.35:
print pn, "|", dt, "|", st, "|" #description
这会打印出一堆重复的这些行:
9991112222 | NJ | 2015-05-14 |
6668885555 | CA | 2015-05-06 |
但是如果我在打印行的末尾添加描述,我会得到一个
SyntaxError: invalid syntax
对如何打印整行有什么想法吗?无论是 pandas 数据框,还是其他格式,都无所谓 - 我只需要输出到 csv 即可。
【问题讨论】: