我是Python和使用编程进行数据分析的新手。我的csv很长,我想动态创建DataFrame并在以后进行绘制。这是一个类似于我的csv文件中存在的数据的DataFrame示例
df = pd.DataFrame(
{"a" : [4 ,5, 6, 'a', 1, 2, 'a', 4, 5, 'a'],
"b" : [7, 8, 9, 'b', 0.1, 0.2, 'b', 0.3, 0.4, 'b'],
"c" : [10, 11, 12, 'c', 10, 20, 'c', 30, 40, 'c']})
可以看出,每列中都有重复的元素。因此,我首先需要找到重复的索引,然后使用该索引来创建子集。这是我这样做的方式。
find_Repeat = df.groupby(['a'], group_keys=False).apply(lambda df: df if
df.shape[0] > 1 else None)
repeat_idxs = find_Repeat.index[find_Repeat['a'] == 'a'].tolist()
如果我打印repeat_idxs,我会得到
[3, 6, 9]
这是我最终想要实现的示例
dfa_1 = df['a'][Index_Identifier[0], Index_Identifier[1])
dfa_2 = df['a'][Index_Identifier[1], Index_Identifier[2])
dfb_1 = df['b'][Index_Identifier[0], Index_Identifier[1])
dfb_2 = df['b'][Index_Identifier[1], Index_Identifier[2])
但是这不是有效和方便的,因为我需要创建许多像这样的DataFrame以便以后绘制。所以我尝试了以下方法
dfNames = ['dfa_' + str(i) for i in range(len(repeat_idxs))]
dfs = dict()
for i, row in enumerate(repeat_idxs):
dfName = dfNames[i]
slices = df['a'].loc[row:row+1]
dfs[dfName] = slices
如果我打印dfs,这正是我想要的。
{'df_0': 3 a
4 1
Name: a, dtype: object, 'df_1': 6 a
7 4
Name: a, dtype: object, 'df_2': 9 a
Name: a, dtype: object}
但是,如果我想阅读我的csv并应用上面的内容,我将无法获得所需的东西。我可以从csv文件中找到重复的索引,但无法正确切片数据。我以为我没有正确读取csv文件。我附上了csv文件,以进一步阐明csv file
答案 0 :(得分:0)
两个选项:
检测重复行索引,然后循环以对数据帧的连续块进行切片,而忽略重复行:
# detect rows for which all values are equal to the column names
repeat_idxs = df.index[(df == df.columns.values).all(axis=1)]
slices = []
start = 0
for i in repeat_idxs:
slices.append(df.loc[start:i - 1])
start = i + 1
结果是数据帧slices
的列表,这些数据帧是按顺序排列的数据切片。
如果您愿意,也可以使用pandas groupby在一行中完成此操作:
grouped = df[~(df == df.columns.values).all(axis=1)].groupby((df == df.columns.values).all(axis=1).cumsum())
现在您可以像这样遍历各个组:
for i, group_df in grouped:
# do something with group_df