2017-05-30 48 views
1

我想清理一些有趣的格式的數據。基本上,數據幀是這樣的:根據一個值的分組數據框

1  2  3 
NaN | a | b | 
    |foo | bar | 
    |foo2 | bar2| 
NaN | c | d | 
    |foo3 | bar3| 

每一次我有一個楠塔1的時候,我想,以填補什麼,我都在列A和B的組合列,直到我遇到另一個的NaN 。最後我想擺脫那個包含NaN的行。

產生的數據幀將如下所示:

1  2  3 
a_b |foo | bar | 
a_b |foo2 | bar2| 
c_d |foo3 | bar3| 

我設法得到我想要通過解析字符串,但代碼是巨大的,我相信有一種更快的方式使用大熊貓做到這一點。

這是我在SO上的第一篇文章,如果我不清楚或者沒有遵循書寫標準,特別是如果標題不明確,我表示歉意。我會感謝任何評論,使我改進。

+0

請告訴我們你有什麼到目前爲止已經試過。 – MrLeeh

回答

0

你可以嘗試這樣的事情,如果這些NaN的真的是空值:

df['key']=df['1'].isnull().cumsum() 

df_header = df[df['1'].isnull()] 

df_out = df_header.merge(df[df['1'].notnull()], on='key',suffixes=('_x','')).set_index(['2_x','3_x']) 

df_out.index = df_out.index.map('_'.join) 

df_out.drop(['1_x','key','1'],axis=1).rename_axis(['1']).reset_index() 

輸出:

1  2  3 
0 a_b  foo  bar 
1 a_b  foo2 bar2 
2 c_d  foo3 bar3 
+1

謝謝@Scott Boston'.cumsum()'正是我想要解鎖我的!那麼它可以很容易地做任何事情,比如'groupby()'等等(我希望我可以放棄你的答案)。如果您有任何想法如何處理特定值「A」而不是空值,我會好奇嗎? (假設第1列在其他隨機值中間有「A」值,在這種情況下'.cumsum'沒有幫助) – Bravo1

+0

您可以這樣做,因爲isnull返回true或false,您可以將其更改爲(df ['1'] =='A')。cumsum()。那些錯誤被轉換爲int,即1或0,並且cumsum只是將它總結在列上。 –

+0

好吧,那麼清楚;)我正在考慮用NaN替換「A」值以便能夠使用'isnull()'......我有很多東西需要學習。 Thx再次爲您的幫助@斯科特波士頓 – Bravo1

0

你可以做到這一點使用功能fillna

import pandas as pd 
import numpy as np 

#df test 
l = ["foo", 
"foo2", 
"foo3", 
"foo4" ] 
df = pd.DataFrame(l) 
df[1] = [np.nan for i in range(3)]+[1] 
df[2] = ["bar"+str(i)for i in range(4)] 

#Filling the nan with the additionned value of the two colums 
df[1] = df[1].fillna(df[2]+df[0]) 

輸入

0  1 2 
0 foo  NaN bar0 
1 foo2 NaN bar1 
2 foo3 NaN bar2 
3 foo4 1.0 bar3 

輸出

0  1   2 
0 foo  bar0foo  bar0 
1 foo2 bar1foo2 bar1 
2 foo3 bar2foo3 bar2 
3 foo4 1.0   bar3 
相關問題