我有一个csv文件,看起来像这样:
col A, col B
1, 5
2,7
78,65
###########
5,8
15,23
###########
17, 15
25,62
12,15
95,56
如何将其转换为一组数据帧,在#########行之间的每个区域一个(如果需要,我可以更改标记)?
结果应该像这样:
df1 = {col A :{1,2,78}, col B: {5,7,65}}
df2 = {col A: {5,15}, col B: {8,23}}
df3 = {col A: {17,25,12,95}, col B: {15,62,15,56}}
我知道有一个使用file.readlines()的解决方案,但它"不是很优雅"。-我想知道是否有一种直接的方法。
深受piRSquared的回答这里的启发,您可以这样接近您的目标:
import pandas as pd
import numpy as np
df = pd.read_csv("/input_file.csv")
# is the row a horizontal delimiter ?
m = df["col A"].str.contains("#", na=False)
l_df = list(filter(lambda d: not d.empty, np.split(df, np.flatnonzero(m) + 1)))
_ = [exec(f"globals()['df{idx}'] = df.loc[~m]") for idx, df in enumerate(l_df, start=1)]
#if you need a dictionnary (instead of a dataframe), you can use df.loc[~m].to_dict("list")
注意:我们使用globals
动态创建变量/子数据帧。
# Output:
print(df1, type(df1)), print(df2, type(df2)), print(df3, type(df3))
col A col B
0 1 5.0
1 2 7.0
2 78 65.0 <class 'pandas.core.frame.DataFrame'>
col A col B
4 5 8.0
5 15 23.0 <class 'pandas.core.frame.DataFrame'>
col A col B
7 17 15.0
8 25 62.0
9 12 15.0
10 95 56.0 <class 'pandas.core.frame.DataFrame'>