【问题标题】:Pandas: What is the fastest way to search a large dataframePandas:搜索大型数据框的最快方法是什么
【发布时间】:2017-05-26 15:04:40
【问题描述】:

熊猫新手问题:

我有一个包含数百万行的数据框,示例输出为:

c_id  c1   c2
0     10  100
0     15  110
0     15  112
2     96  120
56    43  42

对于每个 customer_id,我想创建一个表来做一些事情。最好的方法是什么? 我按 c_id 对数据框进行排序,然后为其设置索引:

df = df.sort('c_id', ascending=False)
df = df.set_index('c_id')

不过是一个简单的操作,比如:

temp_df = df.loc[:0]

需要很长时间,解决这个问题的最快方法是什么? 我认为排序的 set_index 可以解决问题。我猜不是。

EDIT1:

我想为 c_id 的每个值获取 c1 的所有唯一值的列表。就像这样:

df.loc[:0].c1.unique()

【问题讨论】:

  • 可能有很多不同的方法,具体取决于“你想用你的 DF 子集做的事情”。尝试解释您想要实现的目标并发布您想要的数据集...
  • 拥有非唯一索引是不好的,你最好只在c_idgrouping,然后你可以只做gp.get_group(your_c_id)给你一个特定的组但是您需要对 groupby 对象进行一些聚合才能返回 series/df

标签: pandas


【解决方案1】:

不要显式创建组,而是使用 pandas groupby

例如,假设您想为客户找到平均值,您可以这样做:

df.groupby(by = df['c_id']).mean()

等等。

您还可以使用.apply.transform 方法应用(几乎)任意转换(尽管像mean、std、min、max 这样的内置方法效率更高,因为它们已经过优化)。

要回答您的具体问题,您可以:

df.groupby('c_id').c1.nunique()

给出:

c_id
0     2
20    1
56    1
Name: c1, dtype: int64

请注意,一些问题(thisthis)表明 .nunique 不是更快的方法,这是另一种方法:

df.groupby('c_id').c1.apply(lambda x: len(x.unique()))

(我自己没有做过任何基准测试...)

【讨论】:

  • 几乎是正确的答案。我正在寻找的是: df.groupby('c_id').c1.unique() 不知道熊猫可以容纳一个数组。
猜你喜欢
  • 2014-12-19
  • 2017-10-26
  • 2019-10-14
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
相关资源
最近更新 更多