我正在将我的一些R东西移动到
Python,因此我必须使用pandas.DataFrames.有几件事我想优化.
假设我们有一张桌子
key value
abc 1
abc 2
abd 1
我们希望得到一个形式字典{key – >列表[值]}.这就是我现在如何完成这项工作的方法.
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迭代协议,这种协议会破坏基于NumPy的数据结构(如DataFrame)的速度.我知道DataFrame.apply有一个reduce模式,但它没有像dict这样的起始值.
>(一个小缺点)我必须使用索引来从行中获取特定值.我希望我可以像R一样按名称访问行中的特定字段,即行$key而不是row [1] [0]
先感谢您
最佳答案 一种选择是使用groupby并使用pandas系列申请结束:
In [2]: df
Out[2]:
key value
0 abc 1
1 abc 2
2 abd 1
In [3]: df.groupby("key").value.apply(list)
Out[3]:
key
abc [1, 2]
abd [1]
Name: value, dtype: object
In [4]: _3.ix['abc']
Out[4]: [1, 2]