副本必须在“城市”中完成。以' BH'开头的专栏。 复制的df.index应与原始df.index相同 例如 -
STATE CITY
315 KA BLR
423 WB CCU
554 KA BHU
557 TN BHY
# state_df is new dataframe, df is existing
state_df = pd.DataFrame(columns=['STATE', 'CITY'])
for index, row in df.iterrows():
city = row['CITY']
if(city.startswith('BH')):
append row from df to state_df # pseudocode
作为pandas和Python的新手,我需要帮助伪代码以最有效的方式。
答案 0 :(得分:2)
试试这个:
In [4]: new = df[df['CITY'].str.contains(r'^BH')].copy()
In [5]: new
Out[5]:
STATE CITY
554 KA BHU
557 TN BHY
如果我只需要复制行的某些列而不是整个行,该怎么办? 行
cols_to_copy = ['STATE']
new = df.loc[df.CITY.str.contains(r'^BH'), cols_to_copy].copy()
In [7]: new
Out[7]:
STATE
554 KA
557 TN
答案 1 :(得分:1)
startswith
和boolean indexing
的解决方案:
print (df['CITY'].str.startswith('BH'))
315 False
423 False
554 True
557 True
state_df = df[df['CITY'].str.startswith('BH')]
print (state_df)
STATE CITY
554 KA BHU
557 TN BHY
如果只需要复制某些列,请添加loc
:
state_df = df.loc[df['CITY'].str.startswith('BH'), ['STATE']]
print (state_df)
STATE
554 KA
557 TN
<强>计时强>:
#len (df) = 400k
df = pd.concat([df]*100000).reset_index(drop=True)
In [111]: %timeit (df.CITY.str.startswith('BH'))
10 loops, best of 3: 151 ms per loop
In [112]: %timeit (df.CITY.str.contains('^BH'))
1 loop, best of 3: 254 ms per loop
答案 2 :(得分:0)
删除了for循环,最后写了这个: state_df = df.loc [df ['CTYNAME']。str.startswith('Washington'),cols_to_copy]
For循环可能比较慢,但需要检查