如何在python中更新pandas dataframe特定列中的所有行?

时间:2016-08-04 07:33:29

标签: python csv pandas indexing dataframe

我想读取一个csv文件并将此文件存储在pandas data-frame中,之后我想检查一个列值是否等于常量变量,并且相等的行应保存在单独的数据帧中。

下一步是从单独的数据框更新一列。在这一步中,我遍历整个数据帧并更新特定列的所有行,因此我需要花费太多时间,因为我的数据帧有数千行。

Input.csv -

line_no,time
205,1467099122677889
205,1467099122677889
206,1467099363719028
207,1467099363818373
207,1467099363918360
208,1467099363818373
210,1467099363958749

程序 -

import pandas as pd

if __name__ == "__main__":

   file_path = 'Input.csv'
   input_line_no = 205

   pd_dataframe = pd.read_csv(file_path,delimiter=',',keep_default_na=False)
   match_df = pd.DataFrame(pd_dataframe.loc[pd_dataframe['line_no'] == int(input_line_no)])

   if match_df.empty:
       print 'Given line no is not present in dataframe.'
       sys.exit(1)
   match_df = match_df.applymap(str)
   for index in range(0,len(match_df.index)):

        epoch_time = match_df.iloc[index]['time']
        stamp = int(str(epoch_time)+'0')
        date = datetime.datetime.fromtimestamp(stamp / 10000000.0).strftime('%H:%M:%S %f')[:-3]
        match_df['time'].apply(str)
        match_df.iloc[index]['time'] = date

   print match_df.to_csv(index=False)

此时间列位于纪元时间我想将其转换为人类可读的时间戳,因此逻辑仅用于此目的。

但是我面临着与此任务相关的执行时间问题。是 还有其他方法可以更快的方式更新现有的数据框架列吗?

1 个答案:

答案 0 :(得分:2)

你可以先使用IIUC:

match_df = pd_dataframe[pd_dataframe['line_no'] == int(input_line_no)].copy()
print (match_df)
   line_no              time
0      205  1467099122677889
1      205  1467099122677889

您可以使用apply,因为timestamp limitations

  

在[55]中:pd.Timestamp.max
  Out [55]:时间戳(' 2262-04-11 23:47:16.854775807')

match_df['time'] = match_df.time
                           .apply(lambda x: datetime.datetime.fromtimestamp(int(str(x)+'0')
                                   / 10000000.0)) 
print (match_df)
   line_no                       time
0      205 2016-06-28 09:32:02.677889
1      205 2016-06-28 09:32:02.677889

然后:

match_df['time'] = match_df.time
                           .apply(lambda x: datetime.datetime.fromtimestamp(int(str(x)+'0') 
                                   / 10000000.0).strftime('%H:%M:%S %f')[:-3]) 
print (match_df)
   line_no          time
0      205  09:32:02 677
1      205  09:32:02 677