python - Pandas:找到每组中的 N 个最大值然后创建 N 列

标签 python pandas

我想从每个组中查找 N 个最大值,然后使用 ITEMVAL 创建 N 列。

df = pd.DataFrame()
df['DATE'] = ['2018-01-01', '2018-01-01', '2018-01-01', '2018-01-01',
              '2018-01-02', '2018-01-02', '2018-01-02', '2018-01-02']

df['ITEM'] = ['A', 'B', 'C', 'D', 'A', 'B', 'C', 'E']
df['VAL'] = [1, 4, 5, 3, 5, 4, 4, 6]

df

         DATE ITEM  VAL
0  2018-01-01    A    1
1  2018-01-01    B    4
2  2018-01-01    C    5
3  2018-01-01    D    3
4  2018-01-02    A    5
5  2018-01-02    B    4
6  2018-01-02    C    4
7  2018-01-02    E    6

我尝试了以下代码,但我被困在这里。我找不到有效的方法来获得预期的输出。有什么想法吗?

N = 3
df.groupby(['DATE']).apply(lambda x: x.set_index('ITEM').VAL.nlargest(N)).unstack()

ITEM          A    B    C    D    E
DATE                               
2018-01-01  NaN  4.0  5.0  3.0  NaN
2018-01-02  5.0  4.0  NaN  NaN  6.0

预期输出:

         DATE TOP_1  VAL_1 TOP_2  VAL_2 TOP_3  VAL_3
0  2018-01-01     C      5     B      4     D      3
1  2019-01-02     E      6     A      5     B      4

最佳答案

使用GroupBy.cumcount对于柜台柱,通过 DataFrame.set_index reshape 与 DataFrame.unstack对于压平 MultiIndex,请使用带有 f-strings 的列表理解:

df1 = df.groupby(['DATE']).apply(lambda x: x.set_index('ITEM').VAL.nlargest(N)).reset_index()

或者:

df1 = df.sort_values(['DATE','VAL'], ascending=[True, False]).groupby('DATE').head(N)

g = df1.groupby('DATE').cumcount().add(1)
df1 = df1.set_index(['DATE',g]).unstack().sort_index(level=1, axis=1)
df1.columns = [f'{x}_{y}' for x, y in df1.columns]
df1 = df1.reset_index()
print (df1)
         DATE ITEM_1  VAL_1 ITEM_2  VAL_2 ITEM_3  VAL_3
0  2018-01-01      C      5      B      4      D      3
1  2018-01-02      E      6      A      5      B      4

关于python - Pandas:找到每组中的 N 个最大值然后创建 N 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56089741/

相关文章:

python - 运行屏幕截图后图像未存储

python - 在 Mac 上使用 SQL Server ODBC 时出错 : [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 17 for SQL Server' : file not found (0) (SQLDriverConnect)")

Python ReportLab 段落计数打印的行数

Python,包含导入的函数

python - 重新连接屏幕 Linux 后,在 GCP 上运行的 Jupyter Notebook 不显示输出

python - 将特定单词替换为用户词典,其他单词替换为 0

python-3.x - 如何在 pandas 数据框中用 regex 分隔一个字符串和一个空格?

python - 计算 pandas 中每行具有某些值的列数

python - 使用 Pandas [with key column] 将 CSV 与不同的列组合

python - One-hot 编码的逻辑回归