pandas 为列中的每个元素生成一个嵌套框架并合并到当前嵌套框架中

2ic8powd  于 2023-11-15  发布在  其他
关注(0)|答案(1)|浏览(120)

举个例子:

import pandas as pd
import pathlib
from pathlib import Path

cwd = Path('Path/to/somewhere')
df = pd.DataFrame(
    {
        'var1': [0, 5, 10, 15, 20, 25],
        'var2': ['A', 'B']*3,
        'var3': ['A', 'B']*3,
        'path_col': [cwd / 'a.dat', cwd / 'b.dat', cwd / 'c.dat', cwd / 'd.dat', cwd / 'e.dat', cwd / 'f.dat'],
    }
 )

字符串
path_col中的每个路径都指向一个嵌套,我有一个函数将其转换为嵌套,例如:

def open_and_convert_to_df(filepath: pathlib.Path):
    # do things
    return pd.Dataframe(...)
data_df = pd.DataFrame(
    {
        'var4': [10, 20, 30],
        'var5': [100, 200, 300],
        'obs': [1000, 2000, 3000],
    }
)

我想从path_col中的每个路径生成一个data_df,并合并到df中,这样最终的df看起来像这样:

var1 var2 var3 var4 var5 obs
0   0    A    1    10   100  1000
1   0    A    1    10   100  2000
2   0    A    1    10   100  3000
3   0    A    1    10   200  1000
4   0    A    1    10   200  2000
5   0    A    1    10   200  3000
6   0    A    1    10   300  1000
...
n-3 25   B    2    30   200  3000
n-2 25   B    2    30   300  1000
n-1 25   B    2    30   300  2000
n   25   B    2    30   300  3000


换句话说,第一个df的变量1到3是path_col中包含的数据的索引。在这个数据中,var 4和5是obs的索引。我试图用从1到5的所有变量索引obs
到目前为止,我想到的最好的方法是像这样使用.map()方法:

df['path_col'] = df['path_col'].map(open_and_convert_to_df)


我最终在每个path_col元素中得到了正确的df,但是我缺少后续步骤来“取消嵌套”这些元素并获得所需的df。

rslzwgfq

rslzwgfq1#

假设你想要某种类型的join或每一行都有函数的输出,你可以使用concat

out = df.join(pd.concat({k: open_and_convert_to_df(v)
                         for k,v in df['path_col'].items()}
                        ).droplevel(1))

字符串
使用的输入:

df = pd.DataFrame(
    {
        'var1': [0, 5, 10, 15, 20, 25],
        'var2': ['A', 'B']*3,
        'var3': [1, 2]*3,
        'path_col': [cwd / 'a.dat', cwd / 'b.dat', cwd / 'c.dat', cwd / 'd.dat', cwd / 'e.dat', cwd / 'f.dat'],
    }
 )

相关问题