2017-04-20 151 views
2

我試圖摺疊包含ID數據列和每列持有不同字符串的列數的數據框中的行。它看起來像groupby是解決方案,但它似乎傾向於在組上執行一些數字功能 - 我只想保留文本。下面是我得到了什麼?摺疊熊貓數據幀中的行

我有以下形式的數據幀:

index ID  apples pears oranges 
0  101      oranges 
1  134 apples 
2  576    pears 
3  837 apples 
4  576      oranges 
5  134    pears 

的列是乾淨的:使蘋果列將只具有文本「蘋果」中,或這將是空白的」

在有多個項目在同一ID下(在這個例子中,編號134 & 576),我想行坍塌在一起,得到這樣的:

index ID  apples pears oranges 
0  101      oranges 
1  134 apples pears 
2  576    pears oranges 
3  837 apples 

我可以通過遍歷行來做到這一點,但它看起來像一個非熊貓解決方案。有沒有更好的辦法?

回答

5

您可以使用groupby與聚集''.joinsummax

#if blank values are NaN first replace to '' 
df = df.fillna('') 

df = df.groupby('ID').agg(''.join) 
print (df) 
    apples pears oranges 
ID       
101     oranges 
134 apples pears   
576   pears oranges 
837 apples 

也可以工作:

df = df.fillna('') 
df = df.groupby('ID').sum() 
#alternatively max 
#df = df.groupby('ID').max() 
print (df) 
    apples pears oranges 
ID       
101     oranges 
134 apples pears   
576   pears oranges 
837 apples  

此外,如果需要刪除重複每組和每列添加unique

df = df.groupby('ID').agg(lambda x: ''.join(x.unique())) 
+0

第一個建議完美的作品。感謝您的幫助! 任何你可以描述行中發生了什麼的機會:'df = df.groupby('ID')。agg(''。join)'? – user4896331

2

假設坯''

選項1
pivot_table

df.pivot_table(['apples', 'pears', 'oranges'], 'ID', aggfunc=''.join) 

選項2
sort並採取最後一行作爲''將首先被排序

def f(df): 
    return pd.DataFrame(np.sort(df.values, 0)[[-1]], [df.name], df.columns) 

df.set_index(
    'ID', append=True 
).groupby(level='ID', group_keys=False).apply(f) 

雙方產生

 apples oranges pears 
ID       
101   oranges  
134 apples   pears 
576   oranges pears 
837 apples     
+0

是的,作品alos;) – jezrael