2016-11-19 118 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