我应该如何构建和访问数据表,以便我可以在Python 3.5中轻松比较子集?

zhe*_*elt 8 python dataframe python-3.x pandas

  1. 有没有更快,更pythonic的方式这样做?
  2. 是什么产生了这个警告UserWarning: Boolean Series key will be reindexed to match DataFrame index. "DataFrame index.", UserWarning ,我应该关注它吗?

我有一个包含3列的csv文件:org,month,person.

| org |    month   | person |
| --- | ---------- | ------ |
|   1 | 2014-01-01 |    100 |
|   1 | 2014-01-01 |    200 |
|   1 | 2014-01-02 |    200 |
|   2 | 2014-01-01 |    300 |
Run Code Online (Sandbox Code Playgroud)

我读过哪篇文章pandas.core.frame.DataFrame:

data = pd.read_csv('data_base.csv', names=['month', 'org', 'person'], skiprows=1)
Run Code Online (Sandbox Code Playgroud)

最终目标是将两个连续时期之间的人员与第一个时期的人员组进行比较.

org: 1, month: 2014-01-01, count(intersection((100, 200), 200)) / len(set(100, 200)) == 0.5
Run Code Online (Sandbox Code Playgroud)

编辑:我得到它与:

import pandas as pd
import sys

data = pd.read_csv('data_base.csv', names=['month', 'org', 'person'], skiprows=1)
data.sort_values(by=['org', 'month', 'person'])

results = {}
for _org in set(data.org):
    results[_org] = {}
    months = sorted(list(set(data[data.org == _org].month)))
    for _m1, _m2 in zip(months, months[1:]):
        _s1 = set(data[data.org == _org][data.month == _m1].person)
        _s2 = set(data[data.org == _org][data.month == _m2].person)
        results[_org][_m1] = float(len(_s1 & _s2) / len(_s1))
        print(str(_org) + '\t' + str(_m1) + '\t' + str(_m2) + '\t' + str(round(results[_org][_m1], 2)))
        sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

这产生如下输出:

UserWarning: Boolean Series key will be reindexed to match DataFrame index. "DataFrame index.", UserWarning
5640    2014-01-01  2014-02-01  0.75
5640    2014-02-01  2014-03-01  0.36
5640    2014-03-01  2014-04-01  0.6
...
Run Code Online (Sandbox Code Playgroud)

但它真的很慢而且很丑陋 ......按照目前的速度,我的信封计算结果估算了2年一批数据的大约22小时.

nne*_*neo 3

诚然,我从未使用过 Pandas,所以这可能不符合习惯。这仅使用基本的 Python 结构。

import collections
org_month_dict = collections.defaultdict(set)

# put the data into a simple, indexed data structure
for index, row in data.iterrows():
    org_month_dict[row['org'], row['month']].add(row['person'])

orgs = set(data.org)
months = sorted(set(data.months))
for org in orgs:
    for mindex in range(len(months)-1):
        m1 = months[mindex]
        m2 = months[mindex+1]
        print org_month_dict[org, m2] & org_month_dict[org, m1] # persons in common between month 1 and 2
Run Code Online (Sandbox Code Playgroud)

这将创建一个“缓存”查找表,其中org_month_dict按组织和月份进行索引,从而使您无需data[data.org == _org][data.month == _m1]在内部循环中进行昂贵的查找。它的运行速度应该比原始代码快得多。