Python保留列值

时间:2016-11-19 22:43:30

标签: python pandas

我有一个像这样的pandas数据框(index,Place):

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

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

输出应为(index,Place,State):

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

这是一种简单而优雅的方式吗?

3 个答案:

答案 0 :(得分:2)

您可以使用Series.whereindexing with str创建的掩码使用ffill

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 :(得分: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

答案 2 :(得分:0)

广告素材答案

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

enter image description here

认真回答
像@MaxU一样使用extract。区别在于我使用插入。没什么特别好的,只是不同。

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

df

enter image description here