我有一个像这样的数据框
data = pd.DataFrame({'name': [1, 2, 2, 2, 3 , 3, 4],
'type': ['A', 'B', 'B', 'C', 'B', 'C', 'A'],
'hist' : [1,2,1,3,0,3,4]})
data
Out[1]:
hist name type
0 1 1 A
1 2 2 B
2 1 2 B
3 3 2 C
4 0 3 B
5 3 3 C
6 4 4 A
我希望这些数据变得像
data
Out[2]:
hist name type
0 1 1 A
1 2 2 B
2 3 2 C
3 0 3 B
4 3 3 C
5 4 4 A
这意味着我首先应用groupby(['name', 'type'])
,然后对于每个组,我想选择列hist中具有最高值的列。例如,我从
gps = data.groupby(['name', 'type'])
keys = gps.groups.viewkeys()
Out[3]: dict_keys([(3L, 'C'), (3L, 'B'), (2L, 'B'), (2L, 'C'), (1L, 'A'), (4L, 'A')])
gps.get_group(list(keys)[2])
Out[4]:
hist name type
1 2 2 B
2 1 2 B
我的方法是
def mfunc(df):
if len(df) > 1:
idx = df['hist'].idxmax()
l_idx = df.index.tolist()
rm_list = list(set(l_idx) - set([idx]))
df.drop(pd.Int64Index(rm_list), inplace=True)
else:
pass
result = data.groupby(['name', 'type']).apply(mfunc)
但是result
是一个空的DataFrame。
你可以帮助我在这种情况下使用应用功能吗?感谢
答案 0 :(得分:0)
这可能是一种更有效的方法:
var arrInArr = new Array();
或者,你可以这样做:
data.groupby(['name', 'type'])['hist'].max()
答案 1 :(得分:0)
您可以将pivot_table
用于此目的:
df1 = pd.pivot_table(data, index=['name', 'type'], aggfunc=max).reset_index()
In [20]: df1
Out[20]:
name type hist
0 1 A 1
1 2 B 2
2 2 C 3
3 3 B 0
4 3 C 3
5 4 A 4
如果您需要列的特定顺序,可以重新排序结果:
In [33]: df2 = df1[['hist', 'name', 'type']]
In [34]: df2
Out[34]:
hist name type
0 1 1 A
1 2 2 B
2 3 2 C
3 0 3 B
4 3 3 C
5 4 4 A