Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫数据帧-使用初始值减少_Python_R_Pandas_Dataframe_Reduce - Fatal编程技术网

Python 熊猫数据帧-使用初始值减少

Python 熊猫数据帧-使用初始值减少,python,r,pandas,dataframe,reduce,Python,R,Pandas,Dataframe,Reduce,我正在将一些R内容移动到Python,因此我必须使用pandas.DataFrames。有几件事我想优化一下 假设我们有一张桌子 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: :ty

我正在将一些
R
内容移动到
Python
,因此我必须使用
pandas.DataFrame
s。有几件事我想优化一下

假设我们有一张桌子

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迭代协议,从而降低了基于NumPy的数据结构(如
    DataFrame
    )的速度。我知道
    DataFrame.apply
    有一个
    reduce
    模式,但它没有像
    dict
    那样的起始值
  • (一个小缺点)我必须使用索引从行中获取特定值。我希望我可以按名称访问某行中的特定字段,如
    R
    ,即
    行$key
    而不是
    行[1][0]

  • 提前感谢您

    您可以使用dict理解,而不是
    获取dict

    In [100]: {key:grp['value'].tolist() for key, grp in df.groupby('key')}
    Out[100]: {'abc': ['1', '2'], 'abd': ['1']}
    

    自动生成以列表作为值的dict意味着您将离开快速NumPy数组的领域,并强制Python生成需要Python循环对数据进行迭代的对象。当数据集很大时,这些Python循环可能比等效的NumPy/Pandas函数调用慢得多。因此,如果你担心速度,你的最终目标可能并不理想


    如果要利用NumPy/Pandas执行快速(er)计算,必须将数据保存在NumPy数组或Pandas NDFrame中。

    一个选项是使用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]
    

    我不太关注速度,因为我在努力不失去它,因为它可以获得。你能推荐任何NumPy数据结构来代替字典吗?我在
    R
    中使用了
    列表
    ,但情况不同。我选择了
    dict
    ->
    list
    组合键进行快速键搜索和快速追加,而不需要重新分配整个数组。我不知道有任何基于散列的NumPy结构和/或动态数组。或者我应该单独问一个问题?这取决于你下一步想做什么,或者你的最终目标是什么。您可能应该跳过形成这个dict,保留数据帧,并找出基于Pandas的方法可以直接将您带到最终目标。例如,如果您计划汇总列表中的值,那么可能就是您要查找的内容。也许你应该在一个单独的问题中问这个问题,并把所有细节都说清楚。虽然我绝对喜欢你写的那句简洁的话,但我接受了兰迪的回答,因为它与标题更相关。我希望我能投你两次票。多谢各位。