首页 > 解决方案 > 过滤数据框以创建另一个数据框

问题描述

我已经有一个数据框,类似于

x     label     word

10      1        is
20      2        goal
15      2        left
13      0        am
9       1        are
7       0        I
6       1        hello
2       0        world

我正在尝试创建另一个数据框,一旦我执行了从该数据框中提取的操作,它看起来像这样:

label    min    max    words
 0        2     13     I, world, am
 1        6     10     hello, are, is
 2        15    20     goal, left

列中的单词words可以按任意顺序排列。它们代表该特定标签的单词。

我试过使用df.groupby,但我似乎不明白它是如何工作的。有人可以指导我应该寻找什么方法吗?

标签: pythonpandas

解决方案


DataFrameGroupBy.agg由列名和聚合函数的字典使用。然后进入MultiIndex列,因此需要将其展平 - 此处按mapand join,如有必要,最后rename列:

df = df.groupby('label').agg({'x':['min','max'], 'word':', '.join})
df.columns = df.columns.map('_'.join)
d = {'x_min':'min','x_max':'max','word_join':'words'}
df = df.rename(columns=d).reset_index()
print (df)
   label  min  max           words
0      0    2   13    am, I, world
1      1    6   10  is, are, hello
2      2   15   20      goal, left

如果想要聚合列wordlists:

df = df.groupby('label').agg({'x':['min','max'], 'word': lambda x: x.tolist()})
df.columns = df.columns.map('_'.join)
d = {'x_min':'min','x_max':'max','word_<lambda>':'words'}
df = df.rename(columns=d).reset_index()
print (df)
   label  min  max             words
0      0    2   13    [am, I, world]
1      1    6   10  [is, are, hello]
2      2   15   20      [goal, left]

推荐阅读