将几列放在带有pandas的列表中

时间:2017-12-10 12:37:21

标签: list pandas dataframe

我有一个包含5列的数据帧(df)。 我想对前3列使用'group by',并在第4列中列出列表中的值和列5的idem。 我的代码适用于第4列:

df_new=df.groupby(['1','2', '3'])['4'].apply(list)

但我不知道如何管理第5列。

df_new=df.groupby(['1','2', '3'])['4', '5'].apply(list)

不起作用。

2 个答案:

答案 0 :(得分:0)

演示:

来源DF:

In [174]: df = pd.DataFrame(np.random.randint(3, size=(20,5)), columns=list('12345'))

In [175]: df
Out[175]:
    1  2  3  4  5
0   2  1  2  0  0
1   2  0  2  2  0
2   0  2  2  2  2
3   0  2  2  1  2
4   0  2  1  2  1
5   1  1  2  1  2
6   0  2  1  0  1
7   2  2  0  1  1
8   0  0  2  2  1
9   1  0  2  0  0
10  2  0  1  0  1
11  0  1  2  1  2
12  2  0  1  0  1
13  2  0  0  2  0
14  1  1  1  1  0
15  2  2  2  0  0
16  0  1  1  2  2
17  2  1  1  0  0
18  1  0  0  0  1
19  2  2  2  1  2

解决方案:

In [176]: (df.groupby(['1','2', '3'])['4','5']
             .apply(lambda x: pd.Series(x.values.T.tolist(), index=['4','5'])))
Out[176]:
            4       5
1 2 3
0 0 2     [2]     [1]
  1 1     [2]     [2]
    2     [1]     [2]
  2 1  [2, 0]  [1, 1]
    2  [2, 1]  [2, 2]
1 0 0     [0]     [1]
    2     [0]     [0]
  1 1     [1]     [0]
    2     [1]     [2]
2 0 0     [2]     [0]
    1  [0, 0]  [1, 1]
    2     [2]     [0]
  1 1     [0]     [0]
    2     [0]     [0]
  2 0     [1]     [1]
    2  [0, 1]  [0, 2]

答案 1 :(得分:0)

可以先创建一个额外的列,然后再执行操作。

import pandas as pd

df= pd.DataFrame(dict(A=[1,2,2],B=[1,2,2],C=[3,2,2],D=list("ABC"),E=list("DEF")))

df['list'] = df[['D','E']].values.tolist()
df = df.groupby(['A','B','C'])['list'].apply(list)

print(df.to_frame())

返回:

                   list
A B C                  
1 1 3          [[A, D]]
2 2 2  [[B, E], [C, F]]