首页 > 解决方案 > Python Pandas 通过在某些位置对数据进行切片来创建多个数据帧

问题描述

我是 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 文件

标签: python-3.xpandasdata-analysis

解决方案


两种选择:

循环和切片

检测重复行索引,然后循环遍历数据帧的连续块,忽略重复行:

# 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

结果是一个 dataframes 列表slices,它们是按顺序排列的数据切片。

使用熊猫 groupby

如果您愿意,也可以使用 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

推荐阅读