2016-11-19 119 views
3

我有看起来像这样(指数,地点)一个大熊猫数据帧:Python的保留列值

0 California* 
1 LA 
2 San Diego 
3 Oakland 
4 Washington* 
5 Seattle 
6 Tacoma 

在那些状态标有星号Place的值,因此,我想创建一个新的列,并用状态值填充它。我想根据任何具有星号的行为状态赋值,然后为所有后续行填充它,直到新行带有新值。在SAS中,这将通过保留声明来完成,但我不知道它如何与熊猫一起工作。

输出应该是(索引,地方,州):

0 California* California 
1 LA   California 
2 San Diego California 
3 Oakland  California 
4 Washington* Washington 
5 Seattle  Washington 
6 Tacoma  Washington 

什么的要对这个简单而优雅的方式?

回答

2

您可以使用Series.whereindexing with strffill形成的遮掩:

print (df.col.str[-1] == '*') 
0  True 
1 False 
2 False 
3 False 
4  True 
5 False 
6 False 
Name: col, dtype: bool 

df['new'] = df.col.str[:-1].where(df.col.str[-1] == '*').ffill() 
print (df) 
      col   new 
0 California* California 
1   LA California 
2 San Diego California 
3  Oakland California 
4 Washington* Washington 
5  Seattle Washington 
6  Tacoma Washington 
1

您可以结合使用Series.str.extract()Series.ffill()

In [236]: df['State'] = df.Place.str.extract(r'([^\*]+)\*', expand=False).ffill() 

In [237]: df 
Out[237]: 
     Place  State 
0 California* California 
1   LA California 
2 San Diego California 
3  Oakland California 
4 Washington* Washington 
5  Seattle Washington 
6  Tacoma Washington 
0

创造性的答案

df.iloc[:, 0].str.split('*').str[::-1] \ 
    .apply(pd.Series).replace('', np.nan).bfill(1).ffill() 

enter image description here


认真的回答
使用extract像@MaxU。不同的是我正在使用插入。没有什么特别好,只是不同而已。

df.insert(df.shape[1], 'State', df.iloc[:, 0].str.extract('(.*)\*')) 
df = df.ffill() 

df 

enter image description here