对分组数据帧Pandas进行高效操作

时间:2016-05-02 09:34:39

标签: python pandas

我有一个非常大的Pandas数据框,我需要根据另一列在组内进行排序。我知道如何迭代组,对组执行操作并将所有这些组合并回一个数据帧但是这很慢,我觉得有更好的方法来实现这一点。这是输入和我想要的东西。输入:

sumSeries(group.NUMBER.item.*)

输出:

ID   price
1    100.00
1    80.00
1    90.00
2    40.00
2    40.00
2    50.00

由于这超过约5kk记录,大约250,000个ID效率很重要。

2 个答案:

答案 0 :(得分:2)

如果速度是你想要的,那么下面应该是相当不错的,虽然它有点复杂,因为它在numpy中使用复数排序。这类似于在包numpy-groupies中编写聚合排序方法时使用的方法(我的)。

$stmt = $conn->prepare("INSERT INTO users (firstName, lastName, email, username, password, age) VALUES (?, ?, ?, ?, ?, ?)");

$stmt->bind_param(
  "sssssi", $firstName, $lastName, $email, $userName, $passWord, $age
);

//check firstname is set or not
if(isset($_POST['firstName']))
{
    $firstName= $_POST['firstName'];    
}
else
{
    $firstName= NULL;
} 
//check lastname is set or not
if(isset($_POST['lastName']))
{
    $lastName= $_POST['lastName'];  
}
else
{
    $lastName= NULL;
} 
//check email is set or not
if(isset($_POST['email']))
{
    $email= $_POST['email'];    
}
else
{
    $email= NULL;
} 
//check username is set or not
if(isset($_POST['username']))
{
    $userName= $_POST['username'];  
}
else
{
    $userName= NULL;
} 
//check password is set or not
if(isset($_POST['password']))
{
    $passWord= $_POST['password'];  
}
else
{
    $passWord= NULL;
} 
//check age is set or not
if(isset($_POST['age']))
{
    $age= $_POST['age'];    
}
else
{
    $age= 0;
} 

我的机器上5米行需要2秒,比使用大熊猫# get global sort order, for sorting by ID then price full_idx = np.argsort(df['ID'] + 1j*df['price']) # get min of full_idx for each ID (note that there are multiple ways of doing this) n_for_id = np.bincount(df['ID']) first_of_idx = np.cumsum(n_for_id)-n_for_id # subtract first_of_idx from full_idx rank = np.empty(len(df),dtype=int) rank[full_idx] = arange(len(df)) - first_of_idx[df['ID'][full_idx]] df['rank'] = rank+1 要快100倍(虽然我实际上没有运行5米行的熊猫版本,因为它需要太长时间;我不确定@ayhan是如何设法在30秒内完成的,也许是熊猫版本的差异?)。

如果你使用它,那么我建议彻底测试它,因为我没有。

答案 1 :(得分:1)

您可以使用rank

df["order"] = df.groupby("ID")["price"].rank(method="first")
df
Out[47]: 
   ID  price  order
0   1  100.0    3.0
1   1   80.0    1.0
2   1   90.0    2.0
3   2   40.0    1.0
4   2   40.0    2.0
5   2   50.0    3.0

对于5米行,250000 ID(i5-3330)的数据集大约需要30秒:

df = pd.DataFrame({"price": np.random.rand(5000000), "ID": np.random.choice(np.arange(250000), size = 5000000)})
%time df["order"] = df.groupby("ID")["price"].rank(method="first")
Wall time: 36.3 s