从单个纯文本文件中读取多个熊猫数据帧

时间:2020-11-09 10:42:12

标签: python pandas dataframe

我有一个包含3个熊猫数据帧的输出文件。

df1
          A         R         N         D
0  0.033333  0.086667  0.014444  0.058889
1  0.093333  0.084444  0.011111  0.034444
2  0.093333  0.084444  0.011111  0.034444


df2
          A         R         N         D
0  0.033333  0.008889  0.000000  0.055556
1  0.050000  0.016667  0.000000  0.058889
2  0.071111  0.018889  0.003333  0.027778


df3
          A         R         N         D
0  0.016667  0.007778  0.000000  0.003333
1  0.027778  0.002222  0.003333  0.024444
2  0.006667  0.000000  0.000000  0.055556

我需要使用df中的文件作为下一个程序的输入。

我知道我可以打开文件并提取相应的行,然后将它们放入df中。

但是我想知道是否有内置的东西可以读取它们的名称,例如'df1'或'df2'。

我是一个流血的初学者-所以要温柔

谢谢

1 个答案:

答案 0 :(得分:1)

最简单的方法是在dfs中添加一列,以指示这些数据属于哪个df,然后合并并保存它们:

#include <cassert>
#include <vector>

template <typename E>
class VecExpression {
  public:
    double operator[](size_t i) const 
    {
        // Delegation to the actual expression type. This avoids dynamic polymorphism (a.k.a. virtual functions in C++)
        return static_cast<E const&>(*this)[i];
    }
    size_t size()               const { return static_cast<E const&>(*this).size(); }
};

class Vec : public VecExpression<Vec> {
    std::vector<double> elems;

  public:
    double operator[](size_t i) const { return elems[i]; }
    double &operator[](size_t i)      { return elems[i]; }
    size_t size() const               { return elems.size(); }

    Vec(size_t n) : elems(n) {}

    // construct vector using initializer list 
    Vec(std::initializer_list<double> init) : elems(init) {}

    // A Vec can be constructed from any VecExpression, forcing its evaluation.
    template <typename E>
    Vec(VecExpression<E> const& expr) : elems(expr.size()) {
        for (size_t i = 0; i != expr.size(); ++i) {
            elems[i] = expr[i];
        }
    }
};

template <typename E1, typename E2>
class VecSum : public VecExpression<VecSum<E1, E2> > {

    E1 const& _u;
    E2 const& _v;

public:

    VecSum(E1 const& u, E2 const& v) : _u(u), _v(v) {
        assert(u.size() == v.size());
    }

    double operator[](size_t i) const { return _u[i] + _v[i]; }
    size_t size()               const { return _v.size(); }
};

  

template <typename E1, typename E2>
VecSum<E1, E2>
operator+(VecExpression<E1> const& u, VecExpression<E2> const& v) {
   return VecSum<E1, E2>(*static_cast<const E1*>(&u), *static_cast<const E2*>(&v));
}

int main() {

    Vec v0 = {23.4,12.5,144.56,90.56};
    Vec v1 = {67.12,34.8,90.34,89.30};
    Vec v2 = {34.90,111.9,45.12,90.5};

    auto expr = v0 + v1 + v2;
    Vec v1 = expr; // ok
    Vec v2 = expr; // not ok!
}

再次加载后,您可以将它们分开

df = pd.concat([df1.assign(df = 'df1'),df2.assign(df = 'df2'),df3.assign(df = 'df3')])
df.to_csv('data.csv')