- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
总的来说,我是 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 行未打印,因为“Apartment rental”与“Condo”或“Condo sales call”不够相似
这是我目前的代码。我不知道这是否是最好的方法。如果到目前为止我做对了,我不知道如何打印整行感兴趣的内容:
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 dataframe 还是其他格式,都没关系 - 我只需要输出到 csv。
最佳答案
为什么不使用 pandas.groupby
选项来查找唯一组(基于电话号码、州和日期)。这样做可以让您分别处理所有 Description
值,并根据需要对它们执行任何操作。
例如,我将对上述列进行分组,并获取该组中 Description
列的唯一值 -
In [49]: df.groupby(['phone_number','state','date']).apply(lambda v: v['description'].unique())
Out[49]:
phone_number state date
4443337777 NJ 2015-05-14 [condo]
6668885555 CA 2015-05-06 [Apartment, Apartment-rental]
9991112222 NJ 2015-05-14 [Condo, Condo-sales-call, Apartment-rental]
dtype: object
您可以在apply
中使用任何函数。这里有更多示例 - http://pandas.pydata.org/pandas-docs/stable/groupby.html
关于python - 遍历 Pandas 中的行组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30473920/
我是一名优秀的程序员,十分优秀!