【问题标题】:Group by in pandas dataframe and unioning a numpy array column在 pandas 数据框中分组并合并一个 numpy 数组列
【发布时间】:2015-08-22 07:24:53
【问题描述】:

我有一个 CSV 文件,其中一列看起来像一个 numpy 数组。前几行如下所示

first,second,third
170.0,2,[19 234 376]
170.0,3,[19 23 23]
162.0,4,[1 2 3]
162.0,5,[1 3 4]

当我使用 pandas 数据框并使用以下代码加载此 CSV 时

data = pd.read_csv('myfile.csv', converters = {'first': np.float64, 'second': np.int64, 'third': np.array})

现在,我想根据“第一”列进行分组,并合并“第三”列。所以在这样做之后,我的数据框应该看起来像

170.0, [19 23 234 376]
162.0, [1 2 3 4]

我如何实现这一目标?我尝试了以下多种方法,但似乎无助于实现这一目标。

group_data = data.groupby('first')
group_data['third'].apply(lambda x: np.unique(np.concatenate(x)))

【问题讨论】:

  • 你确定你的第二列是一个 np 数组吗?当我运行你的代码时,我得到object 作为dtype,这表明它实际上是一个字符串。你能发布data.info() 和data['second'].iloc[0] 的输出吗
  • 是的,你是对的,它是作为对象加载的。下面是它的样子
    Int64Index:4 个条目,0 到 3 个数据列(共 2 列):前 4 个非空 float64 第二个 4 个非空对象dtypes: float64(1), object(1)
    如何将它们加载为 numpy 数组?
  • 试试这个:data = pd.read_csv('myfile.csv', header=None, names=['first','second'], converters = {'first': np.float64, 'second': np.array}) 您的代码的问题是您的文件没有任何标题名称,因此您的转换器将找不到匹配项
  • 对不起!我已经更正了原来的问题。我的文件确实将列名作为第一行。
  • 你有不一致的分隔符,有些行有空格,有些行没有空格,还有逗号,这是正确的吗?

标签: python numpy pandas


【解决方案1】:

在您当前的 csv 文件中,“第三”列以字符串形式出现,而不是列表。

可能有更好的方法可以转换为列表,但这里是......

from ast import literal_eval

data = pd.read_csv('test_groupby.csv')

# Convert to a string representation of a list...
data['third'] = data['third'].str.replace(' ', ',')

# Convert string to list...
data['third'] = data['third'].apply(literal_eval)

group_data=data.groupby('first')

# Two secrets here revealed
# x.values instead of x since x is a Series
# list(...) to return an aggregated value
#     (np.array should work here, but...?)
ans = group_data.aggregate(
      {'third': lambda x: list(np.unique(
                               np.concatenate(x.values)))})

print(ans)
                    third
first                    
162          [1, 2, 3, 4]
170    [19, 23, 234, 376]

【讨论】:

  • 非常感谢!效果很好!感谢literal_eval,这是关键!
猜你喜欢
  • 2018-09-04
  • 1970-01-01
  • 2017-12-02
  • 2019-03-08
  • 2014-03-22
  • 2021-08-03
  • 1970-01-01
  • 2023-03-09
  • 2021-01-19
相关资源
最近更新 更多