pandas 数据框 - 减少初始值

Eli*_*igo 5 python reduce r dataframe pandas

我正在将我的R一些东西移到Python,因此我必须使用pandas.DataFrames。有几件事我想优化。

假设我们有一张桌子

key value
abc 1
abc 2
abd 1
Run Code Online (Sandbox Code Playgroud)

我们想要得到一个 form 的字典{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']}
Run Code Online (Sandbox Code Playgroud)

我不喜欢它的两件事:

  1. 内置reduce使用标准 Python 迭代协议这一事实会扼杀基于 NumPy 的数据结构(如DataFrame. 我知道它DataFrame.apply有一个reduce模式,但它不需要像dict.
  2. (一个小缺点)我必须使用索引从行中获取特定值的事实。我希望我可以按名称访问一行中的特定字段,例如 in R,即row$key而不是row[1][0]

先感谢您

Ran*_*ndy 1

一种选择是使用 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]
Run Code Online (Sandbox Code Playgroud)