我尝试使用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
希望我的问题有道理:))
答案 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