我有一个数据框
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]]
答案 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_frame
和reset_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()