Python熊猫通过在某些位置切片数据来创建多个数据框

时间:2018-12-18 16:05:10

标签: python-3.x pandas data-analysis

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

1 个答案:

答案 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