使用pandas迭代合并数据帧

时间:2017-12-05 16:11:57

标签: python pandas csv

我尝试使用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"])

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

pd.concat((d1,d2), axis=1,join="outer")

但由于我无法将d1放入内存,因此我一直在使用read_csv(我使用read_csv,因为我已经处理了一个巨大的文件并保存了它到.csv格式,所以想象我的数据帧d1包含在文件test.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

希望我的问题有道理:))

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找combine first方法。它基本上使用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)

返回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