根据列中的一组参数将数据框拆分为多个数据框
Posted
技术标签:
【中文标题】根据列中的一组参数将数据框拆分为多个数据框【英文标题】:Split data frame into multiple data frames based on a group of parameters in a column 【发布时间】:2019-09-15 20:37:56 【问题描述】:我有一个这样的数据框:
DF
ID A B C
00 X0 Y0 PARAMETER_0
01 X1 Y1 PARAMETER_1
02 X2 Y2 PARAMETER_2
03 X3 Y3 PARAMETER_3
04 X4 Y4 PARAMETER_4
05 X5 Y5 PARAMETER_0
06 X6 Y6 PARAMETER_1
07 X7 Y7 PARAMETER_2
08 X8 Y8 PARAMETER_3
09 X9 Y9 PARAMETER_4
10 XX0 YY0 PARAMETER_0
11 XX1 YY1 PARAMETER_1
12 XX2 YY2 PARAMETER_2
13 XX3 YY3 PARAMETER_3
14 XX4 YY4 PARAMETER_4
并且我需要在PARAMETER_4
列中将其拆分为多个数据帧,以得到:
DF_1
ID A B C
00 X0 Y0 PARAMETER_0
01 X1 Y1 PARAMETER_1
02 X2 Y2 PARAMETER_2
03 X3 Y3 PARAMETER_3
04 X4 Y4 PARAMETER_4
DF_2
05 X5 Y5 PARAMETER_0
06 X6 Y6 PARAMETER_1
07 X7 Y7 PARAMETER_2
08 X8 Y8 PARAMETER_3
09 X9 Y9 PARAMETER_4
DF_3
10 XX0 YY0 PARAMETER_0
11 XX1 YY1 PARAMETER_1
12 XX2 YY2 PARAMETER_2
13 XX3 YY3 PARAMETER_3
14 XX4 YY4 PARAMETER_4
我找不到像df.split(axis=0, value='PARAMETER_4')
这样的简单函数
对方法有任何想法吗?提前谢谢!
【问题讨论】:
【参考方案1】:您可以使用比较PARAMETER_4
创建帮助器array
,通过索引和dictionary of DataFrame
s 的累积和来交换值:
s = pd.factorize(df['C'].eq('PARAMETER_4').iloc[::-1].cumsum().sort_index())[0] + 1
print (s)
[1 1 1 1 1 2 2 2 2 2 3 3 3 3 3]
dfs = dict(tuple(df.groupby(s)))
print (dfs[1])
ID A B C
0 0 X0 Y0 PARAMETER_0
1 1 X1 Y1 PARAMETER_1
2 2 X2 Y2 PARAMETER_2
3 3 X3 Y3 PARAMETER_3
4 4 X4 Y4 PARAMETER_4
你需要的是可能的,但不是recommended:
s = df['C'].eq('PARAMETER_4').iloc[::-1].cumsum()
for i, g in df.groupby(s):
globals()[f'DF_i'] = g
print (DF_1)
ID A B C
0 0 X0 Y0 PARAMETER_0
1 1 X1 Y1 PARAMETER_1
2 2 X2 Y2 PARAMETER_2
3 3 X3 Y3 PARAMETER_3
4 4 X4 Y4 PARAMETER_4
另一个想法是检查列c
并按GroupBy.cumcount
创建的计数器系列分组:
s = df.groupby('C').cumcount() + 1
dfs = dict(tuple(df.groupby(s)))
print (dfs[1])
ID A B C
0 0 X0 Y0 PARAMETER_0
1 1 X1 Y1 PARAMETER_1
2 2 X2 Y2 PARAMETER_2
3 3 X3 Y3 PARAMETER_3
4 4 X4 Y4 PARAMETER_4
【讨论】:
嗨@Jezrael。我会试试的,让你知道。无论如何,数据来源是完全可信的,所以我想使用这种方法没有潜在风险。谢谢!【参考方案2】:我们可以在这里使用两次groupby
。首先,我们在C
列上分组并创建一个cumcount
。然后我们对这个 cumcount 进行分组以获取单独的数据帧:
dfs = [d for _, d in df.groupby(df.groupby('C').cumcount())]
print(dfs[0], '\n')
print(dfs[1], '\n')
print(dfs[2])
输出
ID A B C
0 0 X0 Y0 PARAMETER_0
1 1 X1 Y1 PARAMETER_1
2 2 X2 Y2 PARAMETER_2
3 3 X3 Y3 PARAMETER_3
4 4 X4 Y4 PARAMETER_4
ID A B C
5 5 X5 Y5 PARAMETER_0
6 6 X6 Y6 PARAMETER_1
7 7 X7 Y7 PARAMETER_2
8 8 X8 Y8 PARAMETER_3
9 9 X9 Y9 PARAMETER_4
ID A B C
10 10 XX0 YY0 PARAMETER_0
11 11 XX1 YY1 PARAMETER_1
12 12 XX2 YY2 PARAMETER_2
13 13 XX3 YY3 PARAMETER_3
14 14 XX4 YY4 PARAMETER_4
【讨论】:
以上是关于根据列中的一组参数将数据框拆分为多个数据框的主要内容,如果未能解决你的问题,请参考以下文章