大Pandas群体转化

2024-06-23 19:12:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个数据帧

import pandas as pd

 df1 = pd.DataFrame( {     
"Name" : ["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"] ,           
"City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle",     
"Portland"]   } )          

df1.groupby( ["City"] )['Name'].transform(lambda x:     
','.join(x)).drop_duplicates()      
I want the output as      

Name    City                 
Alice,Bob,Mallory,Bob     Seattle           
Mallory,Mallory    Portland        

but i am getting only           
Name         
Alice,Bob,Mallory,Bob                
Mallory,Mallory        

This is an example with small number of columns but in my actual problem i 
have too many columns so i cannot use           
df1['Name']= df1.groupby( ['City'] )['Name'].transform(lambda x:         
','.join(x))              
df1.groupby( ['City','Name'], as_index=False )              
df1.drop_duplicates()          

因为对于每一列,我必须编写相同的代码
有没有办法不为每一列编写转换 个别地。在


Tags: lambdanamecityastransformdroppdbob
2条回答

你可以的

In [42]: df1.groupby('City')['Name'].agg(','.join).reset_index(name='Name')
Out[42]:
       City                   Name
0  Portland        Mallory,Mallory
1   Seattle  Alice,Bob,Mallory,Bob

或者

^{pr2}$

对于多个聚合

df1.groupby('City', as_index=False).agg(
      {'Name': ','.join, 'Name2': ','.join, 'Number': 'max'})

1。列聚合

我认为您需要^{},.join,然后对于变更单,使用双[[]]

df = df1.groupby(["City"])['Name'].apply(','.join).reset_index()
df = df[['Name','City']]
print (df)
                    Name      City
0        Mallory,Mallory  Portland
1  Alice,Bob,Mallory,Bob   Seattle

因为^{}使用聚合值创建新列:

^{pr2}$

2。列和更多聚合

如果更多的列需要在[]中使用指定列的^{}或不指定join all string列:

df1 = pd.DataFrame( {     
"Name" : ["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"] ,  
"Name2":   ["Alice1", "Bob1", "Mallory1", "Mallory1", "Bob1" , "Mallory1"],      
"City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle",     
"Portland"]   } )   
print (df1)
       City     Name     Name2
0   Seattle    Alice    Alice1
1   Seattle      Bob      Bob1
2  Portland  Mallory  Mallory1
3   Seattle  Mallory  Mallory1
4   Seattle      Bob      Bob1
5  Portland  Mallory  Mallory1

df = df = df1.groupby('City')['Name', 'Name2'].agg(','.join).reset_index()
print (df)
       City                   Name                      Name2
0  Portland        Mallory,Mallory          Mallory1,Mallory1
1   Seattle  Alice,Bob,Mallory,Bob  Alice1,Bob1,Mallory1,Bob1

如果需要,聚合所有列:

df = df1.groupby('City').agg(','.join).reset_index()
print (df)
       City                   Name                      Name2
0  Portland        Mallory,Mallory          Mallory1,Mallory1
1   Seattle  Alice,Bob,Mallory,Bob  Alice1,Bob1,Mallory1,Bob1

df1 = pd.DataFrame( {     
"Name" : ["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"] ,  
"Name2":   ["Alice1", "Bob1", "Mallory1", "Mallory1", "Bob1" , "Mallory1"],      
"City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"],
'Numbers':[1,5,4,3,2,1]} )   
print (df1)
       City     Name     Name2  Numbers
0   Seattle    Alice    Alice1        1
1   Seattle      Bob      Bob1        5
2  Portland  Mallory  Mallory1        4
3   Seattle  Mallory  Mallory1        3
4   Seattle      Bob      Bob1        2
5  Portland  Mallory  Mallory1        1


df = df1.groupby('City').agg({'Name': ','.join, 
                              'Name2': ','.join, 
                              'Numbers': 'max'}).reset_index()
print (df)
       City                   Name                      Name2  Numbers
0  Portland        Mallory,Mallory          Mallory1,Mallory1        4
1   Seattle  Alice,Bob,Mallory,Bob  Alice1,Bob1,Mallory1,Bob1        5

相关问题 更多 >

    热门问题