我想读取一个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)
此时间列位于纪元时间我想将其转换为人类可读的时间戳,因此逻辑仅用于此目的。
但是我面临着与此任务相关的执行时间问题。是 还有其他方法可以更快的方式更新现有的数据框架列吗?
答案 0 :(得分:2)
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