如何更新python中熊猫数据框特定列中的所有行?

Posted

技术标签:

【中文标题】如何更新python中熊猫数据框特定列中的所有行?【英文标题】:How to update all rows in particular column of pandas dataframe in python? 【发布时间】:2016-12-10 05:03:52 【问题描述】:

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

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

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)

这个时间列是在纪元时间我想把它转换成人类可读的时间戳,所以逻辑只用于这个目的。

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

【问题讨论】:

如果使用date = datetime.datetime.fromtimestamp(stamp / 10000000.0),则返回2434-11-27 04:20:26.778889。这样对吗?还是2016-06-28 07:32:02 @jezrael - 是的,它是正确的,不用担心。我只想知道如何减少数据框更新列的执行时间? 【参考方案1】:

你可以先使用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

【讨论】:

抱歉,我不确定将 epoch_time 转换为 datetime。我的输出正确吗? @jezrael- 这个脚本是否将正确的行时间插入到正确的位置?因为在 csv 文件中所有时间都不相同,所以有必要将特定行的时间更改为人类可读的时间戳并仅放置在该位置? 为了将纪元转换为人类可读的时间戳,由于某些要求,我的逻辑很好,所以我可以将用于转换为人类时间戳的逻辑放在你的代码中吗?如果是,那怎么办? 我正在寻找解决方案,给我一点时间。 @jezrael- 这一个也足够且正确。 match_df['time'] = match_df.time.apply(lambda x: datetime.datetime.fromtimestamp(int(str(x)+'0') / 10000000.0).strftime('%H:%M:%S %f ')[:-3])

以上是关于如何更新python中熊猫数据框特定列中的所有行?的主要内容,如果未能解决你的问题,请参考以下文章

从熊猫数据框中提取在特定列中具有特定值的所有行

如果特定列中的值不是熊猫数据框中的整数,则删除行

如何通过在两行之间划分特定列中的值并保持其他列不变来在熊猫数据框中创建新行?

在熊猫数据框列中查找特定文本

如何使用熊猫从另一个数据框 B 的列中删除包含特定数量值的数据框 A 中的行?

从熊猫数据框中的组内选择特定行