【问题标题】:Recursive pd.merge() output error递归 pd.merge() 输出错误
【发布时间】:2017-07-16 16:47:13
【问题描述】:

我希望能够收集一组 CSV 文件,这些文件彼此共享一个共同的索引和时间 t,并且我想使用一个名为 mergedf() 的函数将它们合并在一起。在我看来,它似乎有效,只是它打印了 3 次相同的一组值。根据我的if 声明,它似乎正在打印filepath[0] 3 次。另外,也可以是prepdf()函数中的intdf

如果你能帮助我发现我的错误,那就太棒了。

在:

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)

Out(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 DataFrame 的示例:

     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
     ...    ...

【问题讨论】:

  • 每个csv文件的结构都一样吗?
  • @cᴏʟᴅsᴘᴇᴇᴅ 是的。
  • 只是想知道...您的意思是“合并”还是“连接”?因为合并是横向操作...
  • @cᴏʟᴅsᴘᴇᴇᴅ csv 的形状是 m 乘 2,有一个我希望它们“合并”的通用索引。所以 b、b_x 和 b_y 应该是单独的 csvs 做成数据帧
  • 我明白了。你看过this吗?

标签: python python-3.x pandas numpy


【解决方案1】:

IIUC:

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

更新:

我猜想给你显示三次相同的数据集的问题是由以下几行引起的:

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

return intdf   

interp_frame - 未在函数中定义。它很可能是之前在您的 Python 环境(iPython、Jupyter 等)中定义的

【讨论】:

  • 我仍然在 t 之后的列中获得相同的 b 值。因此,因此您所写的内容不起作用。
  • @JulianRachman,我猜是因为您使用的是interp_frame,它没有在您的函数中定义...注意变量名中的下划线字符
  • 好的,我们很好!谢谢你。我不认为我需要为这么小的语法错误写出这么长的问题。
猜你喜欢
  • 1970-01-01
  • 2021-02-28
  • 2018-04-16
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多