簡體   English   中英

Python Pandas 按多列和 append 分組

[英]Python Pandas groupby multiple columns and append

多虧了Python Pandas Groupby/Append 列,我已經接近實現我想要的目標,但仍然不完全存在。

東風:

城市 計划 問題 1 問題 2 問題 3
熱那亞 服務1 啊啊啊 bbb ccc
熱那亞 服務 2 ddd zzz 年年
熱那亞 服務 3 ggg 公私合營 jjj
威尼斯 服務 2 lll vvv
威尼斯 服務 3 eee fff

預期 Output:

城市 問題 1 問題 2 問題 3 問題 4 問題 5 問題 6 問題 7 問題 8 問題 9
熱那亞 啊啊啊 bbb ccc ddd zzz 年年 ggg 公私合營 jjj
威尼斯 lll vvv eee fff

基本上我想:

  1. 按城市分組
  2. 丟棄計划列(如果可能)
  3. Append 所有其他參數(它們仍然需要始終按順序排列,因此如果缺少服務,單元格將為空。

在從鏈接的解決方案中使用 unstack 和 cumcount 玩了一段時間之后,我仍然缺少一些東西來尊重 Plan 列的順序,如果缺少服務則用空單元格填充。

這是我正在使用的代碼:

import pandas as pd

df = pd.read_csv('input.csv')

df1 = df.set_index('City').stack().reset_index(name='vals')
df1['g'] = 'Param' + df1.groupby('City').cumcount().add(1).astype(str)
df1 = df1.pivot(index='City', columns='g', values='vals')

df1.to_csv('output.csv')

在我的測試中,我從輸入中刪除了Plan列,但問題是在對 output 中的參數進行排序后,例如,如果一個城市只有Service 3 ,它們仍然在Service 1下對齊。

這是一個 pivot 問題,但您也可以通過堆疊和取消堆疊來做到這一點:

s = df.set_index(['City', 'Plan']).stack().unstack([1, 2])
s.columns = 'Problem ' + pd.RangeIndex(1, s.shape[1]+1).astype(str)

print (s)

       Problem 1 Problem 2 Problem 3 Problem 4 Problem 5 Problem 6 Problem 7 Problem 8 Problem 9
City                                                                                            
Genoa        aaa       bbb       ccc       ddd       zzz       yyy       ggg       ppp       jjj
Venice       NaN       NaN       NaN       lll       vvv       NaN       eee       fff       mmm

另一種使用melt的方法:

s = df.melt(['City', 'Plan']).pivot('City', ['Plan', 'variable'], 'value')
s.columns = 'Problem ' + pd.RangeIndex(1, s.shape[1]+1).astype(str)

print (s)
       Problem 1 Problem 2 Problem 3 Problem 4 Problem 5 Problem 6 Problem 7 Problem 8 Problem 9
City                                                                                            
Genoa        aaa       ddd       ggg       bbb       zzz       ppp       ccc       yyy       jjj
Venice       NaN       lll       eee       NaN       vvv       fff       NaN       NaN       mmm

排序有點不同,但服務之間的相對排序被保留了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM