在Python中,如何创建频率表并在加载数据块时进行更新?
我有一个庞大的表格(几十亿行),我需要分析其中的两个数值变量,a)创建一个频率表,b)创建分布图 VarA的范围为0.00到1.00(增量为0.01)在Python中,如何创建频率表并在加载数据块时进行更新?,python,large-data,large-files,Python,Large Data,Large Files,我有一个庞大的表格(几十亿行),我需要分析其中的两个数值变量,a)创建一个频率表,b)创建分布图 VarA的范围为0.00到1.00(增量为0.01) VarB分布在0.00左右(增量为0.01) 我想迭代读取1000行,然后更新频率表。我尝试了以下代码: c_尺寸=1000 结果={'A':dict(),'B':dict()} def更新指令(键,val): 如果val不在结果[键]中: 结果[key][val]=1 其他: 结果[key][val]+=1 对于pd.read_csv('da
VarB分布在0.00左右(增量为0.01) 我想迭代读取1000行,然后更新频率表。我尝试了以下代码:
c_尺寸=1000
结果={'A':dict(),'B':dict()}
def更新指令(键,val):
如果val不在结果[键]中:
结果[key][val]=1
其他:
结果[key][val]+=1
对于pd.read_csv('data.csv',name=['ValA','ValB'],skiprows=10,chunksize=c_size)中的数据块:
对于数据块中的行:
valA,valB=行
更新目录('A',valA)
更新目录('B',valB)
打印(结果['A'])
打印(结果['B'])
编辑
为了简化处理过程,我认为应该将处理后的值存储在字典中,而不是存储在两个单独的表中 要在十亿行中每1000行迭代一次,我认为应该使用生成器机制(请参阅) 我在下面展示了一个小例子
input_data = [[1, 2], [2, 3], [3, 4], [2, 4]]
result = {'A': dict(), 'B': dict()}
def update_dict(key, val):
if val not in result[key]:
result[key][val] = 1
else:
result[key][val] += 1
# Since the list is not too big, I use for loop to iterate.
# However, you can apply the generator mechanism for the code below.
for row in input_data:
valA, valB = row
update_dict('A', valA)
update_dict('B', valB)
print(result['A'])
>>> {1: 1, 2: 2, 3: 1}
print(result['B'])
>>> {2: 1, 3: 1, 4: 2}
# Then, you can use these two dictionaries to create two separate tables
# You can also join two tables together using Pandas data frame
要绘制分布图,我建议使用seaborn()绘制漂亮的图。以下是工作代码。谢谢你,彼得·杜,谢谢你的帮助
c_size=1000
结果={'VarA':dict(),'VarB':dict()}
def更新指令(键,val):
如果val不在结果[键]中:
结果[key][val]=1
其他:
结果[key][val]+=1
reader=pd.read\u csv('file.csv',name=['VarA','VarB',skiprows=10,chunksize=c\u size)
对于i,枚举(读取器)中的数据块:
对于data_chunk.values中的行:
valA,valB=行
更新目录('VarA',np.round(valA,2))
更新目录('VarB',np.round(valB,2))
I get:“valA,valB=行值错误:太多值无法解压缩(预期为2)”我可以知道您的输入数据及其类型吗?我在本地机器上用显示的input\u data
测试了代码,结果很好。我用上次使用的代码更新了问题。基本上,数据是一个包含两个数值(几十亿行)的大型CSV表。我知道,您的data\u chunk
可能是一种数据帧。因此,当您遍历它时,它只获取每行的索引。您可以通过打印数据块
或行
来测试它。我建议将带有for循环的行修改为for data\u chunk中的行。值:
,以便您可以接收处理的np.ndarray。