使用pandas迭代合并数据帧

Sun*_*iss 5 python csv pandas

我正在尝试使用read_csv合并pandas中的两个数据帧.但是我的一个数据帧(在这个例子中d1)对于我的计算机来说太大了,所以我正在使用该iterator参数read_csv.

假设我有两个数据帧

d1 = pd.DataFrame({
    "col1":[1,2,3,4,5,6,7,8,9],
    "col2": [5,4,3,2,5,43,2,5,6],
    "col3": [10,10,10,10,10,4,10,10,10]}, 
    index=["paul", "peter", "lauren", "dave", "bill", "steve", "old-man", "bob", "tim"])

d2 = pd.DataFrame({
    "yes/no": [1,0,1,0,1,1,1,0,0]}, 
    index=["paul", "peter", "lauren", "dave", "bill", "steve", "old-man", "bob", "tim"])
Run Code Online (Sandbox Code Playgroud)

我需要合并它们,以便每行捕获每个人的所有数据,所以相当于:

pd.concat((d1,d2), axis=1,join="outer")
Run Code Online (Sandbox Code Playgroud)

但由于我无法将d1放入内存,我一直在使用read_csv(我正在使用, read_csv因为我已经处理了一个巨大的文件并将其保存为.csv格式,所以想象一下我的数据帧d1包含在文件中test.csv).

itera = pd.read_csv("test.csv",index_col="index",iterator=True,chunksize=2)
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做

for i in itera:
    d2 = pd.concat((d2,i), axis=1,join="outer")
Run Code Online (Sandbox Code Playgroud)

我的输出是第二个数据帧附加的第一个数据帧.

我的输出如下:

        col1  col2  col3   yes/no
one     NaN   NaN   NaN     1.0
two     NaN   NaN   NaN     0.0
three   NaN   NaN   NaN     1.0
four    NaN   NaN   NaN     0.0
five    NaN   NaN   NaN     1.0
six     NaN   NaN   NaN     1.0
seven   NaN   NaN   NaN     1.0
eight   NaN   NaN   NaN     0.0
nine    NaN   NaN   NaN     0.0
one     1.0   5.0  10.0     NaN
two     2.0   4.0  10.0     NaN
three   3.0   3.0  10.0     NaN
four    4.0   2.0  10.0     NaN
five    5.0   5.0  10.0     NaN
six     6.0  43.0   4.0     NaN
seven   7.0   2.0  10.0     NaN
eight   8.0   5.0  10.0     NaN
nine    9.0   6.0  10.0     NaN
Run Code Online (Sandbox Code Playgroud)

希望我的问题有道理:)

dub*_*dan 1

我认为您正在寻找组合第一方法。它基本上使用迭代器df1中每个块的值进行更新read_csv

import pandas as pd
from StringIO import StringIO

d1 = pd.DataFrame({
    "col1":[1,2,3,4,5,6,7,8,9],
    "col2": [5,4,3,2,5,43,2,5,6],
    "col3": [10,10,10,10,10,4,10,10,10]}, 
    index=["paul", "peter", "lauren", "dave", "bill", "steve", "old-man", "bob", "tim"])


#d2 converted to string tho use with pd.read_csv
d2 =  StringIO("""y/n col5
paul 1 
peter 0 
lauren 1 
dave 0 
bill 1 
steve 1
old-man 1
bob 0
tim 0
""")

#For each chunk update d1 with data
for chunk in pd.read_csv(d2, sep = ' ',iterator=True,chunksize=1):
    d1 = d1.combine_first(chunk[['y/n']])
#Number formatting
d1['y/n'] = d1['y/n'].astype(int)
Run Code Online (Sandbox Code Playgroud)

返回d1结果如下:

         col1  col2  col3  y/n
bill        5     5    10    1
bob         8     5    10    0
dave        4     2    10    0
lauren      3     3    10    1
old-man     7     2    10    1
paul        1     5    10    1
peter       2     4    10    0
steve       6    43     4    1
tim         9     6    10    0
Run Code Online (Sandbox Code Playgroud)