我正在尝试使用read_csv在pandas中合并两个数据帧。但是我的一个数据帧(在这个例子中)太大了,我的计算机无法处理,所以我在d1中使用了iterator参数。
假设我有两个数据帧

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"])

我需要合并它们,以便每一行捕获每个人的所有数据,因此相当于:
pd.concat((d1,d2), axis=1,join="outer")

但是由于我无法将d1放入内存,所以我一直在使用read_csv(我使用read_csv,因为我已经处理了一个巨大的文件并将其保存为.csv格式,所以假设我的数据帧d1包含在文件read_csv中)。
itera = pd.read_csv("test.csv",index_col="index",iterator=True,chunksize=2)

但当我这么做的时候
for i in itera:
    d2 = pd.concat((d2,i), axis=1,join="outer")

我的输出是由第二个数据帧追加的第一个数据帧。
我的输出如下:
        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

希望我的问题有意义:)

最佳答案

我想你在找combine first方法。它基本上用迭代器中每个块的值更新df1

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)

它返回的read_csv看起来像:
         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

07-27 19:50