【问题标题】:Python - Data processing with arrayPython - 使用数组进行数据处理
【发布时间】:2018-04-17 20:21:45
【问题描述】:

我正在使用 Python 处理来自 csv 文件的数据,在将 csv 读入数组后,我的数据如下所示:

data = [
    ["10","2018-03-22 14:38:18.329963","name 10","url10","True"],
    ["11","2018-03-22 14:38:18.433497","name 11","url11","False"],
    ["12","2018-03-22 14:38:18.532312","name 12","url12","False"]
]

我知道我可以使用“for”循环,但我的数据有大约数百万条记录,并且“for”循环需要很长时间才能运行,所以你知道不使用“for”来完成下面列出的任务吗?

  1. 将第 1 列中的值从字符串转换为整数(即​​:“10” -> 10)
  2. 在第 3 列添加“http://”(即:“url10”->“http://url10”)
  3. 将第 4 列中的值转换为布尔值(即:“False” -> False)

非常感谢!

【问题讨论】:

标签: python arrays loops data-processing


【解决方案1】:

您可以将map 与预定义函数一起使用。 maplarger input 上的列表理解快:

def clean_data(row):
   val, date, name, url, truthy = row
   return [int(val), date, name, 'http://{}'.format(url), truthy == 'True']


data = [
["10","2018-03-22 14:38:18.329963","name 10","url10","True"],
["11","2018-03-22 14:38:18.433497","name 11","url11","False"],
["12","2018-03-22 14:38:18.532312","name 12","url12","False"]
]
print(list(map(clean_data, data)))

输出:

[[10, '2018-03-22 14:38:18.329963', 'name 10', 'http://url10', True], [11, '2018-03-22 14:38:18.433497', 'name 11', 'http://url11', False], [12, '2018-03-22 14:38:18.532312', 'name 12', 'http://url12', False]]

【讨论】:

  • 不错的解决方案。这既简单又干净。
  • 太棒了!非常感谢!
【解决方案2】:

Pandas 应该是一种选择,如果您不介意先花一些时间将数据加载到数据框中。

以下是一种使用Pandas的解决方案,然后简单地比较一下ma​​p解决方案的时间成本。

import pandas as pd
from datetime import datetime
data = [
    ["10","2018-03-22 14:38:18.329963","name 10","url10","True"],
    ["11","2018-03-22 14:38:18.433497","name 11","url11","False"],
    ["12","2018-03-22 14:38:18.532312","name 12","url12","False"]
]*10000 #multiply 10000 to simulate large data, you can test with one bigger number.

#Pandas
df = pd.DataFrame(data=data, columns=['seq', 'datetime', 'name', 'url', 'boolean'])
pandas_beg = datetime.now()
df['seq'] = df['seq'].astype(int)
df['url'] = 'http://' + df['url']
df['boolean'] = df['boolean'] == 'True'
pandas_end = datetime.now()
print('pandas: ', (pandas_end - pandas_beg))

#map
def clean_data(row):
   val, date, name, url, truthy = row
   return [int(val), date, name, 'http://{}'.format(url), truthy == 'True']
map_beg = datetime.now()
result = list(map(clean_data, data))
map_end = datetime.now()
print('map: ', (map_end - map_beg))

输出:

pandas:  0:00:00.016091
map:  0:00:00.036025
[Finished in 0.997s]

【讨论】:

  • 酷。谢谢老哥
猜你喜欢
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 2017-11-03
  • 2020-12-09
  • 1970-01-01
相关资源
最近更新 更多