2017-07-16 121 views
1

我希望能够使用一个名为mergedf()的函数将一个共享索引和时间为t的CSV文件集合在一起,并且我想将它们合并到一起。它看起来像它的工作,除了它打印3次相同的值。看起来好像是根据我的if声明打印filepath[0] 3次。另外,在prepdf()函数中也可以是intdf递归pd.merge()输出错误

如果你能帮我发现我的错误,那将是惊人的。

在:

def prepdf(path, mi, ma): 
    csv = pd.read_csv(path, usecols=[0,1], skiprows=1, names = ['t','b']) 
    df = DataFrame(csv) 

    fs = 2 
    T = 1/fs 
    ts = np.arange(mi, ma, T) 

    interpdata = {} 

    for key in ['b']: 
     spl = interpolate.interp1d(df['t'], df[key]) 
     interpdata[key] = spl(ts) 

    interpframe = pd.DataFrame(interpdata, index=ts) 
    interpframe.index.name = 'ts' 
    interpframe.reset_index(inplace=True) 
    interpframe['t'] = interpframe['ts'] 
    temp = interpframe.loc[interpframe['b'] > 0.5, 't'] 
    interpframe.loc[interpframe['b'] > 0.5, 't'] = temp 
    interpframe['t'] = interpframe['t'].fillna(method='ffill') 
    interpframe.set_index('t', inplace=True) 
    inttmp = interp_frame 
    intdf = interp_frame.head(n=len(inttmp)) 

    return intdf 

PATHS = ['data1.csv', 'data2.csv', 'data3.csv'] 
filepath = [file for file in PATHS] 

for path in PATHS: 
    df = prepdf(path, 650, 1000) 
    print(df) 

print(len(PATHS)) 

def mergedf(n): 
    if len(PATHS)-1-n == 0: 
     return prepdf(filepath[0], 650, 1000) 
    else: 
     return pd.merge(prepdf(filepath[len(PATHS)-1-n], 650, 1000), mergedf(n+1), left_on='t', right_on='t') 

mergedf(0) 

出(mergedf(0)):

t  b   b_x   b_y 
0 650.0 0.105299 0.105299 0.105299 
1 650.5 0.193072 0.193072 0.193072 
2 651.0 0.115404 0.115404 0.115404 
3 651.5 0.047509 0.047509 0.047509 
4 652.0 0.119501 0.119501 0.119501 
5 652.5 -0.187888 -0.187888 -0.187888 
...  ...  ...  ...  ... 
695  997.5 0.165262 0.165262 0.165262 
696  998.0 -0.131729 -0.131729 -0.131729 
697  998.5 0.038266 0.038266 0.038266 
698  999.0 0.093568 0.093568 0.093568 
699  999.5 0.022013 0.022013 0.022013 

700 rows × 4 columns 

这里是一个CSV数据帧的一个示例:

 t   b 
0 650.0 0.105299 
1 650.5 0.193072 
2 651.0 0.115404 
3 651.5 0.047509 
4 652.0 0.119501 
5 652.5 -0.187888 
    ... ... 
+0

每个csv文件具有相同的结构? –

+0

@cᴏʟᴅsᴘᴇᴇᴅ是的。 –

+0

只是想知道......你的意思是“合并”或“连接”?因为合并是一个水平操作... –

回答

0

IIUC:

df = pd.concat([prepdf(x, 650, 1000) for x in PATHS], axis=1) 

UPDATE:

我想展示你的问题,同样的数据集三次是由以下几行引起的:

intdf = interp_frame.head(n=len(inttmp)) 

return intdf 

interp_frame - 是不是在函数中定义。最有可能它是在你的Python环境(iPython,Jupyter等)之前定义的

+0

我在t之后的列中仍然获得相同的b值。所以你写的东西是行不通的。 –

+0

@JulianRachman,我想这是因为你正在使用'interp_frame',它没有在你的函数中定义...请注意变量名称中的下划线字符 – MaxU

+0

哦!可能是..... –