我正在将一些关于
假设我们有一个表格。
我们希望得到一个形式为
R
的内容迁移到 Python
,因此我必须使用 pandas.DataFrame
。有几件事情我想要进行优化。假设我们有一个表格。
key value
abc 1
abc 2
abd 1
我们希望得到一个形式为
{key -> list[values]}
的字典。这是我目前的实现方式。from pandas import DataFrame
from StringIO import StringIO
def get_dict(df):
"""
:param df:
:type df: DataFrame
"""
def f(accum, row):
"""
:param accum:
:type accum: dict
"""
key, value = row[1]
return accum.setdefault(key, []).append(value) or accum
return reduce(f, df.iterrows(), {})
table = StringIO("key\tvalue\nabc\t1\nabc\t2\nabd\t1")
parsed_table = [row.rstrip().split("\t") for row in table]
df = DataFrame(parsed_table[1:], columns=parsed_table[0])
result = get_dict(df) # -> {'abc': ['1', '2'], 'abd': ['1']}
我不喜欢这个的两个方面:
- 内置的
reduce
使用标准Python迭代协议,导致像DataFrame
这样的基于NumPy的数据结构速度变慢。我知道DataFrame.apply
有一个reduce
模式,但它没有像dict
那样带一个起始值。 - (一个小缺点)我必须使用索引才能从行中获取特定的值。我希望我可以像在
R
中一样通过名称访问行中的特定字段,即row$key
而不是row[1][0]
提前谢谢
dict
->list
组合进行快速键搜索和快速追加,这不需要重新分配整个数组。我不知道是否存在任何基于哈希的NumPy结构和/或动态数组。还是应该单独提出这个问题? - Eli Korvigodf.groupy('key').agg(...)
可能是你要寻找的。 - unutbu