2015-10-22 33 views
1

我有一個數據幀,看起來像這樣:如何根據另一列的字符串值更新一列的行? Python的大熊貓

df = pd.DataFrame({'Planets': ['Mars','Mars','Mars', 'Jupyter', 'Venus', 'Venus', 'Mercury'], 'Rank': [1,np.nan, np.nan, 2, 3, np.nan, 4]}) 

我期待更新基於地球的條目併發的排名列(其中有零點)。例如,如果有零點的排名列中的條目「1」後,我們會填充未來兩個空行與1

+1

Jupyter在python問題。尼斯。 –

+0

它還有點不清楚?示例輸出將是不錯的 – The6thSense

+1

'fillna'應該做你需要的東西:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html – IanS

回答

2

您可以使用ffill(向前填充):

In [11]: df 
Out[11]: 
    Planets Rank 
0  Mars  1 
1  Mars NaN 
2  Mars NaN 
3 Jupyter  2 
4 Venus  3 
5 Venus NaN 
6 Mercury  4 

In [12]: df["Rank"].ffill() 
Out[12]: 
0 1 
1 1 
2 1 
3 2 
4 3 
5 3 
6 4 
Name: Rank, dtype: float64 

In [13]: df["Rank"] = df["Rank"].ffill() 

In [14]: df 
Out[14]: 
    Planets Rank 
0  Mars  1 
1  Mars  1 
2  Mars  1 
3 Jupyter  2 
4 Venus  3 
5 Venus  3 
6 Mercury  4 
+0

我試圖記住,如果有一個groupby方法來獲得這個「排名」,另一個選項可能是使用分類。 –

+1

'groupby'-wise你可以做'df.groupby(「Planets」)[「Rank」] .ffill()'或(我可以做什麼,因爲它不取決於非nan值在哪裏) 'df.groupby( 「行星」)[ 「等級」]。變換(最大)'。 – DSM

+0

@DSM變換(最大)技巧是整潔的。如果你還沒有它,你能想出一個獲得'等級'的方法嗎?就像是一個羣體的枚舉嗎?(就像一個側面的cumcount?) –

1

假設你想通過等級排序的最終結果:

>>> df.sort(['Planets', 'Rank']).ffill().sort('Rank') 
    Planets Rank 
0  Mars  1 
1  Mars  1 
2  Mars  1 
3 Jupyter  2 
4 Venus  3 
5 Venus  3 
6 Mercury  4 

完全不同的方法是使用一個字典的理解,以獨特的星球地圖:

df['Rank'] = df.Planets.map({planet: n for n, planet in enumerate(df.Planets.unique())}) 

>>> df 
    Planets Rank 
0  Mars  0 
1  Mars  0 
2  Mars  0 
3 Jupyter  1 
4 Venus  2 
5 Venus  2 
6 Mercury  3 
+0

如果Rank沒有排序,那麼最可能的不是排序:s –

+0

@AndyHayden它是行星之後的第二類, – Alexander

+0

啊,我把它想象成簡單的行星編號,它可以是這個小例子:) –

相關問題