Groupby一列并将2列应用到列表pandas中

时间:2017-11-30 11:33:19

标签: python pandas

我有一个数据框

id  name value    flag
1    a     x        F
1    b     y        A
2    c     z        B
3    d     m        Q

如果我想分组id并将值列作为列表放入新列。

我能做到

df.groupby('id')['value'].apply(list).reset_index()

有什么方法可以通过“id”来进行分组。但是将2列(名称和值)放入列表中。

my desired output


id    col
 1    [[a,x],[b,y]]
 2    [[c,z]]
 3    [[d,m]]

4 个答案:

答案 0 :(得分:3)

values之后将列转换为numpy array,然后转移到list中的groupby或单独转换为新Series

df = df.groupby('id')
       .apply(lambda x: x[['name','value']].values.tolist())
       .reset_index(name='col')
print (df)
   id               col
0   1  [[a, x], [b, y]]
1   2          [[c, z]]
2   3          [[d, m]]

或者:

s = pd.Series(df[['name','value']].values.tolist(), index=df.index)
df = s.groupby(df['id']).apply(list).reset_index(name='col')
print (df)
   id               col
0   1  [[a, x], [b, y]]
1   2          [[c, z]]
2   3          [[d, m]]

如果list s中的元组没有问题:

s = pd.Series(list(zip(df['name'],df['value'])), index=df.index)
df = s.groupby(df['id']).apply(list).reset_index(name='col')
print (df)
   id               col
0   1  [(a, x), (b, y)]
1   2          [(c, z)]
2   3          [(d, m)]

答案 1 :(得分:2)

zip中使用apply,即

df.groupby('id').apply(lambda x: list(zip(x['name'],x['value'])))

id
1    [(a, x), (b, y)]
2            [(c, z)]
3            [(d, m)]
dtype: object

要匹配您的确切输出,请使用to_framereset_index,即

df.groupby('id').apply(lambda x: list(zip(x['name'],x['value']))).to_frame('col').reset_index()

  id               col
0   1  [(a, x), (b, y)]
1   2          [(c, z)]
2   3          [(d, m)]

答案 2 :(得分:1)

您可以使用numpy的public static void main(String args[])throws IOException{ int i,people,timeai,tablenoai; double iprice,timebi,tablenobi; char decider1; String name; InputStreamReader read=new InputStreamReader(System.in); BufferedReader in=new BufferedReader(read); System.out.println("Welcome To Joel's Restaurant"); System.out.println("How Many People Do You Have?"); people=Integer.parseInt(in.readLine()); System.out.println("And May I Know Your Good Name?"); name=in.readLine(); } public static void sleep(The_Restaurant millis) throws InterruptedException{ double timebi; int timeai; timebi=Math.random()*1000; timeai=(int)timebi; Thread.sleep(timeai); } public static void main(The_Restaurant args[])throws IOException{ int tablenoai; double tablenobi; tablenobi=Math.random()*10; tablenoai=(int)tablenobi; System.out.println("Mr."+name+"Table For"+people+"Your Table No Is"+tablenoai); } 函数将两列转换为一列列表,然后使用pandas'拥有stack功能。

导入和构建数据框:

groupby

功能:

import pandas as pd
import numpy as np

df = pd.DataFrame(
    [[1,'a','x','F'],
     [1,'b','y','A'],
     [2,'c','z','B'],
     [3,'d','m','Q']],
    columns=['id','name','value','flag']
).set_index('id')

返回:

df.assign(col=list(np.stack(df[['name','value']].values))) \
    .groupby(level=0)['col'].apply(list).to_frame()

答案 3 :(得分:0)

修复以前的错误解决方案

df = pd.DataFrame({"i" : [i % 3 for i in range(20)], "x" : range(20), "y" : range(20)}) # Init a dummy dframe
df = df.groupby('i')\
        .apply(lambda row: tuple(zip(row['x'], row['y'])))\
        .reset_index()