Python 如何在熊猫身上进行复杂的群舞?

Python 如何在熊猫身上进行复杂的群舞?,python,pandas,numpy,group-by,Python,Pandas,Numpy,Group By,我有一个数据框,如: a b id 1 10 6 1 2 6 -3 1 3 -3 12 1 # id is 1, but needs a tie breaker 4 -2 12 1 # id is 1, but needs a tie breaker 5 4 8 2 6 12 11 2 7 3 -5 2 8 3 -5 2 如

我有一个数据框,如:

      a    b   id
1    10    6    1
2     6   -3    1
3    -3   12    1  # id is 1, but needs a tie breaker
4    -2   12    1  # id is 1, but needs a tie breaker
5     4    8    2 
6    12   11    2  
7     3   -5    2
8     3   -5    2
如何创建一个新的数据帧,该数据帧首先获取
id
列,然后每次
b
列超过10,如果有多行符合此标准,则通过选择列
a
中具有最小值的行来打破僵局:

      a    b   id
1    -3   12    1 
2    12   11    2 

我有一个数据帧,大约有2000000行和10000个
id
值,所以for循环非常慢

这里有一个解决方案,如果
df
是您的原始数据帧:

df2 = df[df['b'] > 10]
out = df2.loc[df2.groupby('id')['a'].idxmin()]
你应该得到:

    a   b  id
3  -3  12   1
6  12  11   2

这里有一个解决方案,如果
df
是您的原始数据帧:

df2 = df[df['b'] > 10]
out = df2.loc[df2.groupby('id')['a'].idxmin()]
你应该得到:

    a   b  id
3  -3  12   1
6  12  11   2

您可以根据id进行分组,并应用一个查询b>10并查找最小值a的函数。见下文

def my_func(group):
    return df.ix[group.query('b>10')['a'].argmin(), ['a','b']]

print df.groupby(['id']).apply(my_func).reset_index()
这导致

  id   a   b
0   1  -3  12
1   2  12  11

您可以根据id进行分组,并应用一个查询b>10并查找最小值a的函数。见下文

def my_func(group):
    return df.ix[group.query('b>10')['a'].argmin(), ['a','b']]

print df.groupby(['id']).apply(my_func).reset_index()
这导致

  id   a   b
0   1  -3  12
1   2  12  11
编写一个函数,根据您对
b
的条件过滤
数据帧
,然后获得
a
最小值为
idxmin
的索引。然后,我们将此函数应用于分组数据

>>> def get_rows(data):
    ...     return data.loc[data.loc[data['b'] > 10].a.idxmin()]

>>> data.groupby('id').apply(get_rows)
     a   b  id
id            
1   -3  12   1
2   12  11   2
编写一个函数,根据您对
b
的条件过滤
数据帧
,然后获得
a
最小值为
idxmin
的索引。然后,我们将此函数应用于分组数据

>>> def get_rows(data):
    ...     return data.loc[data.loc[data['b'] > 10].a.idxmin()]

>>> data.groupby('id').apply(get_rows)
     a   b  id
id            
1   -3  12   1
2   12  11   2

下面是另一个解决方案:

data = {'a': [10,6,-3,-2,4,12,3,3], 'b': [6,-3,12,12,8,11,-5,-5], 'id': [1,1,1,1,2,2,2,2]}
df = pandas.DataFrame.from_dict(data)
grouper = df[df.b > 10].groupby(df.id)
filtered = list()
for group, group_data in grouper:
    filtered.append(group_data.apply(min))
df_filtered = pandas.DataFrame.from_records(filtered)

# output
    a   b  id
0  -3  12   1
1  12  11   2

注意:在这种情况下,结果的索引将为[0,1]。

这里是另一个解决方案:

data = {'a': [10,6,-3,-2,4,12,3,3], 'b': [6,-3,12,12,8,11,-5,-5], 'id': [1,1,1,1,2,2,2,2]}
df = pandas.DataFrame.from_dict(data)
grouper = df[df.b > 10].groupby(df.id)
filtered = list()
for group, group_data in grouper:
    filtered.append(group_data.apply(min))
df_filtered = pandas.DataFrame.from_records(filtered)

# output
    a   b  id
0  -3  12   1
1  12  11   2

注意:在这种情况下,结果的索引将是[0,1]。我不认为这会起作用,因为
min
必须应用于特定列,而不是所有列。如果可以使用
df.min('a')
进行选择,那么这将起作用。我不认为这会起作用,因为
min
必须应用于特定列,而不是所有列。如果可以使用
df.min('a')
进行选择,那么这就行了。