我有一个包含三行的DataFrame:单元,影响者和值。有几种不同类型的影响者,其值表示单位的数量。 我想创建一个新表,显示每个影响者的频率最高和频率最低的n个单位及其各自的值。
我的df看起来像这样:
Unit Influencer Value
A foo 321
B foo 200
C foo 20
D foo 12
E foo 3
A bar 999
B bar 209
C bar 89
D bar 34
E bar 15
F bar 2
我的输出应如下所示(假设我们需要顶部和底部2个单位):
Unit Influencer Value
A foo 321
B foo 200
D foo 12
E foo 3
A bar 999
B bar 209
E bar 15
F bar 2
我已经尝试过类似找到here的解决方案,但是我收到错误消息“索引包含重复的条目,无法重塑”,我认为这是因为“ Influencer”是我df的索引。如果我的df是multiindex,则创建新的df,但是它是不正确的。
def get_top3(counts, col1, col2):
top3 = (counts.groupby(col1))[col2].apply(lambda x: x.nlargest(3)).reset_index(level=1, drop=True).to_frame('VAL')
top3 = counts.set_index(np.arange(len(counts)) % 3, append=True)['value'].unstack().add_prefix('VAL')
return top3
但是,这会创建一个数据框,如下所示:
VAL1 VAL2 VAL3
321 NaN NaN
NaN 200 NaN
NaN NaN 20
12 NaN NaN
NaN 3 NaN
...
任何建议将不胜感激!我也愿意就如何格式化输出df提出反馈。谢谢!
答案 0 :(得分:3)
使用
#df=df.sort_values('Value')
g=df.groupby('Influencer')
pd.concat([g.head(2),g.tail(2)]).sort_index()
Out[693]:
Unit Influencer Value
0 A foo 321
1 B foo 200
3 D foo 12
4 E foo 3
5 A bar 999
6 B bar 209
9 E bar 15
10 F bar 2
答案 1 :(得分:2)
您可以尝试:
nlargest = df.groupby('Influencer')['Value'].nlargest(2).reset_index()['level_1'].values
nsmallest = df.groupby('Influencer')['Value'].nsmallest(2).reset_index()['level_1'].values
result = pd.concat([df.iloc[nlargest], df.iloc[nsmallest]]).sort_index()
print(result)
输出
Unit Influencer Value
0 A foo 321
1 B foo 200
3 D foo 12
4 E foo 3
5 A bar 999
6 B bar 209
9 E bar 15
10 F bar 2
答案 2 :(得分:0)
尝试创建如下功能:
def selc_df(df, x=2):
return df.head(x).append(df.tail(x))
selc_df(df,2)
示例:
>>> df
A B
0 1 345
1 2 366
2 3 299
3 3 455
4 4 879
5 5 321
6 5 957
7 6 543
结果:
>>> def selc_df(df, x=2):
... return df.head(x).append(df.tail(x))
...
>>> selc_df(df,2)
A B
0 1 345
1 2 366
6 5 957
7 6 543