2015-10-22 61 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

啊,我把它想象成简单的行星编号,它可以是这个小例子:) –

相关问题