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')
进行选择,那么这就行了。